2012-06-23 2 views
2

Je cours ffmpeg.exe via un code Java pour coder un fichier vidéo. Comment mon programme va-t-il savoir quand ffmpeg est terminé (c'est-à-dire que le fichier vidéo est encodé)?Quand ffmpeg se termine-t-il?

Voici le code:

Runtime.getRuntime().exec("ffmpeg -ac 2 -i audio.wav -i video.flv -sameq out.flv"); 
+1

Vous découvrirez que c'est une manière très fragile de construire un 'processus' quand il rencontre un chemin ou un nom de fichier contenant un espace. Comme des conseils généraux. 1) Utilisez les méthodes qui acceptent un tableau d'arguments. 2) Utilisez un 'ProcessBuilder' pour le code 1.5+, ce qui le rend un peu plus simple à 3) Implémentez toutes les suggestions de [Quand Runtime.exec() ne le fera pas] (http://www.javaworld.com/javaworld/ jw-12-2000/jw-1229-traps.html) BTW - pourquoi utiliser ffmpeg plutôt que jffmpeg? –

+1

Qu'est-ce que cela a à voir avec Xuggle? À ma connaissance, ffmpeg & Xuggle sont des projets entièrement distincts. –

+0

Je n'étais pas au courant de jffmpeg.Merci. –

Répondre

4

Vous pouvez utiliser la méthode waitFor() de java.lang.Process:

Process p = Runtime.getRuntime().exec("ffmpeg..."); 
int exitValue = p.waitFor() 

Avec cela, le thread courant jusqu'à ce que le Process p a pris fin.

EDIT:

Vous pouvez essayer de voir la sortie de ffmpeg:

class StreamDump implements Runnable { 

    private InputStream stream; 

    StreamDump(InputStream input) { 
     this.stream = input; 
    } 

    public void run() { 
     try { 
      int c; 
      while ((c = stream.read()) != -1) { 
       System.out.write(c); 
      } 
     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 
} 

et

Process p = Runtime.getRuntime().exec("ffmpeg.exe..."); 
new Thread(new StreamDump(p.getErrorStream()), "error stream").start(); 
new Thread(new StreamDump(p.getInputStream()), "output stream").start(); 
try { 
    p.waitFor(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
System.out.println("Exit value: " + p.exitValue()); 
+0

cela ne fonctionne pas avec ffmpeg. –

+0

Que se passe-t-il? Avez-vous une erreur? – jalopaba

+0

Non, le thread en cours et le thread parent vont tous les deux à l'état d'attente. Et le codage vidéo s'arrête également. –

0

J'ai trouvé un travail autour, si le fichier est tenté de out.flv renommer alors qu'il est en cours de codage, il ne le permet pas, il ne peut être renommé qu'après la fin de l'encodage:

Runtime.getRuntime().exec("ffmpeg -ac 2 -i audio.wav -i video.flv -sameq out.flv"); 

File tempFile=new File("out.flv"); 
File renamedFile=new File("renamed.flv"); 
while(!tempFile.renameTo(renamedFile)); //try re-naming the file which is being encoded by ffmpeg 

System.out.println("Encoding done");