2012-03-26 19 views
5

Also, ich bin ein Programm erstellen, das FLV-Dateien in andere Formate konvertiert. Dafür benutze ich ffmpeg, das seine Aufgabe perfekt erledigt, wenn es über die Befehlszeile ausgeführt wird. Zum Beispiel:Externer Befehl wird nicht vollständig ausgeführt - Java

ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3 

Dieses Beispiel funktioniert wie ein Charme - es gibt kein einziges Problem, wenn der Befehl ausgeführt wird.

ABER wenn ich versuche, den gleichen Befehl innerhalb einer Java-Klasse auszuführen, tritt ein Problem auf. Ich mache dies in einem Versuch-Catch-Block:

Die Konsole druckt "Start". Es beginnt zu konvertieren und es endet nicht.
Kann mir jemand helfen?

+0

druckt es auch "Ende"? – Nerdtron

+0

das \ t in C: \ test wird als C: est übergeben, übrigens ... Sie müssen den Backslash entkommen. –

+0

'ffmpeg' ist sicherlich kein' DOS' Befehl. Es ist ein Befehlszeilenprogramm. –

Antwort

5

Nun, das Problem wurde auf eine sehr unerwartete Weise gelöst. Ich musste nur die Ausgabe lesen, die die Ausführung erzeugt. Und, voila, die Datei wurde konvertiert.

InputStream in = p.getErrorStream(); 
int c; 
while ((c = in.read()) != -1) 
{ 
    System.out.print((char)c); 
} 
in.close(); 
3

Zwei Probleme:

  1. cmd /c ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3 ist kein Befehl. (Sie am Ende wahrscheinlich eine IOException bekommen, die die "End" verursacht, unterdrückt werden.)

    cmd ist der Befehl, den Sie ausführen möchten, und der Rest des Strings sind Argumente. Verwenden Sie ProcessBuilder oder Runtime.exec(String[] cmdarray)

  2. Sie müssen warten, bis der Prozess abgeschlossen ist. Anruf

    p.waitFor(); 
    

    nach dem Start des Prozesses. Hier ist ein Link für die Dokumentation von Process.waitFor.

+0

Sie haben Recht, obwohl ich vermute, dass etwas anderswo nicht in Ordnung ist. Gegenwärtig sollte das Programm * nicht auf den Prozess warten und so sollte "End" fast sofort auf die Konsole gedruckt werden –

0

Haben Sie die Kontrolle String "versucht, so etwas wie:.

cmd "ffmpeg" -i "C:\test.flv" -acodec "libmp3lame" -y "C:\test.mp3" 

oder

cmd "ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3" 
0

Zunächst einmal, das ist kein DOS-Befehl Es ist ein Konsolenbefehl Zeile, von jedem Geschmack von Microsoft Windows

Sie können es tun mit p.waitFor() als @aioobe erklärt, oder Sie können eine Wrapper-Java-API für FFMPEG wie Xuggler verwenden, wäre es einfach zu bedienen, und es hat LGPL.

Verwandte Themen