2010-07-06 5 views
5

J'essaie d'exécuter ffmpeg via l'appel exec sur linux. Cependant, je dois utiliser des guillemets dans la commande (ffmpeg l'exige). J'ai regardé le doc java pour processbuilder et exec et questions sur stackoverflow mais je n'arrive pas à trouver une solution.Java Runtime.getRuntime(). Exec() avec des guillemets

Je dois exécuter

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 

Je dois insérer des citations dans la chaîne d'arguments ci-dessous. Notez simplement que l'ajout de guillemets simples ou doubles précédés d'une barre oblique inversée ne fonctionne pas en raison de la nature de la façon dont processbuilder analyse et exécute les commandes.

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

Toute aide serait grandement appréciée.

Répondre

6

Créer un tableau!

exec peut prendre un tableau de chaînes, qui sont utilisés comme un tableau de commande & arguments (par opposition à un tableau de commandes)

Quelque chose comme ça ...

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

vous pouvez supprimer les caractères "new String []"; les accolades produiront automatiquement un tableau de chaînes pour vous. –

+1

Cela ne fonctionnera pas comme rtmp: //127.0.0.1/vod/sample start = xxx stop = xxx doit être entouré de guillemets. Mettre l'argument dans un tableau de chaînes n'aide pas. –

+0

Désolé, n'a pas d'aide si vous mettez des guillemets échappés, comme suit: "\" rtmp: //127.0.0.1/vod/sample start = 1500 stop = 24000 \ "" – laher

1

Il semble comme vous avez besoin d'échapper des citations à l'intérieur de votre chaîne d'arguments. C'est assez simple à faire avec un antislash précédent.

E.g.

String containsQuote = "\""; 

Ceci évaluera à une chaîne contenant seulement le caractère de citation.

Ou dans votre cas particulier:

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"; 
Questions connexes