2010-07-06 6 views
5

Ich versuche, ffmpeg über den Exec-Aufruf unter Linux auszuführen. Allerdings muss ich Anführungszeichen im Befehl verwenden (ffmpeg benötigt es). Ich habe das Java-Dokument für processbuilder und exec und Fragen zu stackoverflow durchgesehen, aber ich kann nicht scheinen, eine Lösung zu finden.Java Runtime.getRuntime(). Exec() mit Anführungszeichen

brauche ich

ffmpeg -i "rtmp://127.0.0.1/vod/sample start=1500 stop=24000" -re -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/qltv 

ich Anführungszeichen in das unten Argument Zeichenfolge einfügen müssen, um laufen. Beachten Sie, dass das einfache Hinzufügen von einfachen oder doppelten Anführungszeichen, denen ein umgekehrter Schrägstrich vorangestellt ist, nicht funktioniert, da processbuilder die Befehle analysiert und ausführt.

String argument = "ffmpeg -i rtmp://127.0.0.1/vod/" 
        + nextVideo.getFilename() 
        + " start=" + nextVideo.getStart() 
        + " stop=" + nextVideo.getStop() 
        + " -re -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/qltv"; 

Jede Hilfe würde sehr geschätzt werden.

Antwort

6

Machen Sie ein Array!

exec kann ein Array von Strings nehmen, die als ein Array von Befehl & Argumente verwendet werden (im Gegensatz zu einer Reihe von Befehlen entgegengesetzt) ​​

So etwas ...

String[] arguments = new String[] { "ffmpeg", 
"-i", 
"rtmp://127.0.0.1/vod/sample start=1500 stop=24000", 
"-re", 
... 
}; 
+0

Sie die Zeichen "new String []" entfernen; Die Klammern erzeugen automatisch ein String-Array für Sie. –

+1

Dies funktioniert nicht rtmp: //127.0.0.1/vod/sample start = xxx stop = xxx muss Anführungszeichen um es haben. Das Argument in ein String-Array zu bringen, hilft nicht. –

+0

Tut mir leid, hilft es nicht, wenn Sie gemachte Zitate setzen, wie folgt: "\ rtmp: //127.0.0.1/vod/sample start = 1500 stop = 24000 \" " – laher

1

Es klingt So müssen Sie die Anführungszeichen in der Argument-Zeichenkette umgehen. Dies ist einfach genug mit einem vorhergehenden Backslash zu tun.

z.

String containsQuote = "\""; 

Dies wird zu einer Zeichenfolge ausgewertet, die nur das Anführungszeichen enthält.

Oder in Ihrem speziellen Fall:

String argument = "ffmpeg -i \"rtmp://127.0.0.1/vod/" 
      + nextVideo.getFilename() 
      + " start=" + nextVideo.getStart() 
      + " stop=" + nextVideo.getStop() + "\"" 
      + " -re -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/qltv";