SSH सर्वर पर किसी फ़ाइल (जबकि इसे संशोधित किया जा रहा है) को देखने के लिए VLC का उपयोग कैसे करें (sftp या smth का उपयोग करके)?


1

मैं वीडियो रिकॉर्ड करने के लिए अपने ssh सर्वर का उपयोग कर रहा हूं और मैं रिकॉर्डिंग के दौरान उन्हें (विंडोज 7 या 8 का उपयोग करते हुए पीसी पर) देखने में सक्षम होना चाहता हूं। मैं निश्चित रूप से फाइल को तब ट्रांसफर कर सकता हूं जब मैं कर रहा हूं और इसे देखता हूं, लेकिन मैं रिकॉर्डिंग के दौरान इसे देखना चाहता हूं, जो 2 घंटे तक चल सकता है।

मैं VLC सर्वर का उपयोग नहीं करना चाहता क्योंकि यह वीडियो को एन्कोड करता है और मेरा SSH सर्वर एक Odroid C1 पर है (जो मुझे लगता है कि इसके लिए पर्याप्त शक्तिशाली नहीं है), और मैं कुछ गुणवत्ता को ढीला करूंगा।

मैंने यहां कुछ विचार देखे VLC: क्या मैं SSH पर स्ट्रीम कर सकता हूं? लेकिन यह पर्याप्त नहीं है।

मैंने यहाँ 2 कोणों के बारे में सोचा है:

  • फ़ाइल को "अनिश्चित काल" डाउनलोड करने का एक तरीका खोजना: इसका मतलब है कि जब तक फ़ाइल बड़ी हो रही है, तब तक डाउनलोड जारी रहेगा। लेकिन मुझे नहीं पता कि अगर यह संभव है, तो मैंने WinSCP की कोशिश की है, लेकिन यह भी लगता है कि फ़ाइल लगातार अपडेट हो रही है।
  • VLC में फाइल को कुछ इस तरह से स्ट्रीम करना "sftp: ///" लेकिन मुझे नहीं पता कि VLC के साथ कनेक्शन को कैसे कॉन्फ़िगर किया जाए (मेरा SSH कनेक्शन 22 पोर्ट पर नहीं है और मैं सार्वजनिक / निजी कुंजी का उपयोग करता हूं)।

क्या किसी के पास कोई विचार है?


इनपुट क्या है? एक जीवित स्रोत? आप वीडियो को कैसे रिकॉर्ड कर रहे हैं? आप किस प्रारूप में रिकॉर्डिंग कर रहे हैं?
slhck

मैंने एक जावा प्रोग्राम लिखा है जो एक जीवित स्रोत को एक फ़ाइल में रिकॉर्ड करता है (एक "सरल" FileOutputStream के साथ)। फ़ाइल एक एमपीईजी फ़ाइल है, और रिकॉर्डिंग खत्म होने तक "बढ़ती" है।
14:17 पर सिल

मैंने कई एसएफटीपी ग्राहकों की कोशिश की, लेकिन हर मामले में मुझे फ़ाइल को खोलने से पहले डाउनलोड करना होगा। मुझे उम्मीद है कि Swish मदद करेगा लेकिन भले ही हमारे पास एक लिंक हो: sftp: // user @ server: port / path / file.mpeg, जब आप इस पर क्लिक करते हैं तो फाइल डाउनलोड हो जाती है, और पता VLC के साथ काम नहीं करता है ।
सिल

जवाबों:


2

चूंकि मेरे सभी वीएलसी के साथ "sftp: //" लिंक के साथ सीधे स्ट्रीम करने का प्रयास विफल हो गया था, मैं एक छोटा सा जावा प्रोग्राम लिखने में कामयाब रहा, जो फ़ाइल को डाउनलोड करके और रिमोट फ़ाइल के आकार की जांच करके मुझे हमेशा वही करने की ज़रूरत थी जो मैं चाहता था यदि आवश्यक हो तो डाउनलोड फिर से शुरू करने के लिए बदल गया है।

यहाँ कुंजी कोड का टुकड़ा है:

    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);
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.