Comment utiliser VLC pour regarder un fichier (pendant qu'il est modifié) sur un serveur SSH (en utilisant sftp ou autrement)?

J'utilise mon serveur ssh pour enregistrer des vidéos et j'aimerais pouvoir les regarder (sur un PC à l'aide de Windows 7 ou 8) pendant l'enregistrement. Je peux bien sûr transférer le fichier lorsque je l'ai terminé et je le regarde, mais je le regarde pendant l'enregistrement, qui peut durer 2 heures.

Je ne veux pas utiliser un serveur VLC car il encode la vidéo et mon serveur SSH est sur un Odroid C1 (pas assez puissant pour ce que je pense), et je perdrais une certaine qualité.

J'ai vu quelques idées VLC: Puis-je diffuser sur SSH? Mais ce n'est pas suffisant.

J'ai pensé à 2 angles ici:

  • Trouver un moyen de télécharger le fichier "indéfiniment": ce qui signifie que, tant que le fichier sera plus grand, le téléchargement se poursuivra. Mais je ne sais pas si cela est possible, j'ai essayé WinSCP, mais le téléchargement finit même par penser que le fichier est constamment mis à jour.
  • En streaming du fichier avec quelque chose comme ça dans VLC "sftp: ///" mais je ne sais pas comment configurer la connexion avec VLC (ma connexion SSH n'est pas sur le port 22 et j'utilise des clés publiques / privées).

Est-ce que quelqu'un a des idées?

One Solution collect form web for “Comment utiliser VLC pour regarder un fichier (pendant qu'il est modifié) sur un serveur SSH (en utilisant sftp ou autrement)?”

Étant donné que toutes mes tentatives de transmission directe avec VLC avec un lien "sftp: //" ont échoué, j'ai réussi à écrire un petit programme java qui ferait exactement ce dont j'avais besoin en téléchargeant le fichier et en vérifiant toujours si la taille du fichier distant A changé pour reprendre le téléchargement si nécessaire.

La clé ici est ce code:

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."); 

Je publie également le code entier du programme si quelqu'un est intéressé:

 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); } } } 
  • Comment trouver l'URL du flux vidéo de mon DVR de sécurité par moi-même?
  • Lors de la lecture de DVD avec le lecteur multimédia VLC, la vidéo et l'audio s'arrêtent plusieurs fois par seconde
  • Convertir le fichier vidéo MOV encodé en tant que `qtrle` dans Windows en utilisant FFMPEG
  • Comment empêcher VLC de redimensionner automatiquement sa fenêtre en fonction de la résolution de contenu affiché?
  • Comment supprimer le titre et les autres métadonnées des fichiers vidéo?
  • VLC peut-il se rappeler de la position du film?
  • Comment puis-je installer vlc-srpos-plugin sur Ubuntu?
  • VLC 2.0 - Comment configurer la bibliothèque multimédia?
  • Comment modifier la sortie audio par défaut dans VLC à 5.1?
  • Le streaming / transcodage a échoué
  • Extrayant "l'une de chaque 10 images" dans une vidéo utilisant VLC ou FFmpeg
  • Soyons le génie de l'ordinateur et du réseau.