web-dev-qa-db-ja.com

VLCを使用してSSHサーバー上のファイル(変更中)を監視する方法(sftpまたはsmth elseを使用)?

Sshサーバーを使用してビデオを録画していますが、録画中に(Windows 7または8を使用するPCで)ビデオを視聴できるようにしたいと考えています。もちろん、終わったらファイルを転送して見ることもできますが、2時間続く録画中に見たいと思っています。

ビデオをエンコードし、SSHサーバーがOdroid C1上にあるため(私が思うほど強力ではない)、VLCサーバーを使用したくありません。品質が低下します。

ここでいくつかのアイデアを見ました VLC:SSH経由でストリーミングできますか? しかし、それだけでは十分ではありません。

私はここで2つの角度について考えました:

  • ファイルを「無期限に」ダウンロードする方法を見つける:ファイルが大きくなる限り、ダウンロードが続行されることを意味します。しかし、それが可能かどうかはわかりません。WinSCPを試しましたが、ファイルが常に更新されているにもかかわらず、ダウンロードは終了します。
  • VLC "sftp:///"でこのようなファイルをストリーミングしますが、VLCとの接続を構成する方法がわかりません(SSH接続がポート22になく、公開/秘密鍵を使用しています)。

誰かアイデアはありますか?

2
Syl

「sftp://」リンクを使用してVLCで直接ストリーミングする試みはすべて失敗したため、ファイルをダウンロードして、必要なことを正確に実行する小さなJavaプログラムを作成することができました。必要に応じてダウンロードを再開するために、リモートファイルのサイズが変更されているかどうかを常に確認します。

ここで重要なのは、そのコードです。

    sftpChannel.get(remotePath, outstream, monitor, ChannelSftp.OVERWRITE, 0);
    long localSize;
    Thread.sleep(1000);
    while(sftpChannel.lstat(remotePath).getSize() > (localSize = new File(localPath).length())){
        sftpChannel.get(remotePath, outstream, monitor, ChannelSftp.RESUME, localSize);
        Thread.sleep(timeToWaitBeforeUpdatingFile);

    }
    System.out.println("The download is finished.");

誰かが興味を持っているなら、私はプログラムのコード全体も投稿しています:

package streamer;

import Java.io.Console;
import Java.io.File;
import Java.io.FileNotFoundException;
import Java.io.FileOutputStream;
import Java.io.IOException;
import Java.io.OutputStream;
import Java.util.Arrays;
import Java.util.InputMismatchException;
import Java.util.Scanner;
import Java.util.Vector;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import com.jcraft.jsch.SftpProgressMonitor;

public class Streamer {
    public static void main(String[] args) throws InterruptedException, IOException {
        JSch jsch = new JSch();

        if(args.length != 7){
            System.out.println("Incorrect parameters:");
            System.out.println("Streamer user Host port privateKeyPath remotePath localPath vlcPath");
            System.exit(-1);
        }

        String user = args[0];
        String Host = args[1];
        int port = -1;
        try {
            port = Integer.parseInt(args[2]);
        } catch (NumberFormatException e3) {
            System.out.println("Port must be an integer");
            System.exit(-1);
        }
        String privateKeyPath = args[3];

        String remotePath = args[4];
        String localPath = args[5];
        String vlcPath = args[6];

        int timeToWaitBeforeUpdatingFile = 5000;
        String password = "";

        Console console = System.console();
        if (console == null) {
            System.out.println("Couldn't get Console instance");
            //password = "";
            System.exit(-1);
        }else{
            char passwordArray[] = console.readPassword("Enter your password: ");
            password = new String(passwordArray);
            Arrays.fill(passwordArray, ' ');
        }

        try {
            jsch.addIdentity(privateKeyPath, password);
        } catch (JSchException e) {
            System.out.println(e.getMessage());
            System.out.println("Invalid private key file");
            System.exit(-1);
        }

        Session session;
        try {
            session = jsch.getSession(user, Host, port);
            Java.util.Properties config = new Java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);

            System.out.println("Establishing connection...");
            session.connect();
            System.out.println("Connection established.");
            System.out.println("Creating SFTP Channel...");
            ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
            sftpChannel.connect();
            System.out.println("SFTP Channel created.");

            try {
                @SuppressWarnings("unchecked")
                Vector<ChannelSftp.LsEntry> recordings = sftpChannel.ls(remotePath + "*.mpeg");
                if(recordings.isEmpty()){
                    System.out.println("There are no recordings to watch.");
                    System.exit(0);
                }
                int choice = 1;
                System.out.println("Chose the recording to watch:");
                for (ChannelSftp.LsEntry e : recordings){
                    System.out.println("[" + choice++ + "] " + e.getFilename());
                }
                Scanner sc = new Scanner(System.in);
                try {
                    String fileName = recordings.get(sc.nextInt() - 1).getFilename();
                    remotePath += fileName;
                    localPath += fileName;
                } catch (InputMismatchException e) {
                    System.out.println("Incorrect choice");
                    System.exit(-1);
                }
                System.out.println("You chose : " + remotePath);
                sc.close();
            } catch (SftpException e2) {
                System.out.println("Error during 'ls': the remote path might be wrong:");
                System.out.println(e2.getMessage());
                System.exit(-1);
            }

            OutputStream outstream = null;
            try {
                outstream = new FileOutputStream(new File(localPath));
            } catch (FileNotFoundException e) {
                System.out.println("The creation of the file" + localPath + " failed. Local path is incorrect or writing permission is denied.");
                System.exit(-1);
            }

            try {
                SftpProgressMonitor monitor = null;
                System.out.println("The download has started.");
                System.out.println("Opening the file in VLC...");
                try {
                    Runtime.getRuntime().exec(vlcPath + " " + localPath);
                } catch (Exception ex) {
                    System.out.println("The file couldn't be opened in VLC");
                    System.out.println("Check your VLC path.");
                    System.out.println(ex);
                }
                sftpChannel.get(remotePath, outstream, monitor, ChannelSftp.OVERWRITE, 0);
                long localSize;
                Thread.sleep(1000);
                while(sftpChannel.lstat(remotePath).getSize() > (localSize = new File(localPath).length())){
                    sftpChannel.get(remotePath, outstream, monitor, ChannelSftp.RESUME, localSize);
                    Thread.sleep(timeToWaitBeforeUpdatingFile);

                }
                System.out.println("The download is finished.");
                outstream.close();
                System.exit(0);
            } catch (SftpException e1) {
                System.out.println("Error during the download:");
                System.out.println(e1.getMessage());
                System.exit(-1);
            }
        } catch (JSchException e) {
            System.out.println("Connection has failed (check the user, Host, port...)");
            System.exit(-1);
        }
    }
}
2
Syl