[英]Java execute command doesn't work in code
我在我的Java程序中調用java.lang.Runtime.exec(...)來運行一個命令(一些FFMPEG
命令),只是傳遞給我的函數:
private static void RunCommand(String command) throws InterruptedException {
try {
// Execute command
Process proc = Runtime.getRuntime().exec(command);
}
}
對於簡單的FFMPEG情況,例如ffmpeg -i input.avi -c copy output.avi
它運行正常。
但是對於其中一個命令,顯然它沒有運行。 當我在命令行中復制/粘貼確切的String時,我能夠運行它並查看輸出文件。
ffmpeg -i "concat:/home/temp10.avi|/home/p2.avi|/home/temp15.avi" -c copy -y /home/output.avi
代碼中的以下內容如下:
String c4="ffmpeg -i \"concat:"+dir+temp1+"|"+dir+ad+"|"+dir+temp3+"\" -c copy -y "+dir+output;
到底是怎么回事? 有沒有猜到它為什么不在代碼中運行? 如果"
導致問題,為什么相應的字符串看起來不錯?!
您編寫的命令:
ffmpeg -i "concat:/home/temp10.avi|/home/p2.avi|/home/temp15.avi" -c copy -y /home/output.avi
在shell運行時工作。 引號是shell語法的一部分,不是ffmpeg語法的一部分。 由於|
引用是必要的 character,如果沒有引用shell,則會導致shell構建一個管道。 當它被引用時,它只是傳遞給ffmpeg。
你想用java Runtime exec
函數完成同樣的事情,但是exec
不像shell。 它不執行管道,重定向,引用或$variable
替換。 它將字符串拆分為空格,並使用生成的字符串數組執行等效的unix execvp
。
因為exec
不會對|
做任何特殊的事情 性格,沒有必要引用。 您傳遞給exec以完成與上述shell命令相同的操作的字符串應該是
ffmpeg -i concat:/home/temp10.avi|/home/p2.avi|/home/temp15.avi -c copy -y /home/output.avi
根據文件名的不同,您可能遇到並發症。 假設你的shell命令看起來像這樣:
ffmpeg -i "concat:/home/temp 10.avi|/home/p2.avi|/home/temp15.avi" -c copy -y /home/output.avi
(差異:第一個文件名temp 10.avi
有空格。)現在引用有2個目的:阻止|
從創建管道,並防止空間分裂參數。 如果你嘗試將它傳遞給刪除引號的exec
,它將無法工作,因為字符串將被拆分,生成這個參數數組:
-i
concat:/home/temp
10.avi|/home/p2.avi|/home/temp15.avi
-c
copy
-y
/home/output.avi
這不是ffmpeg想要的; 它需要在包含完整輸入規范的-i
之后的單個字符串。 您必須自己完成拆分字符串的工作,因此您可以將空間留在參數中,如下所示:
Runtime.getRuntime().exec(
new String[] {
"ffmpeg",
"-i",
"concat:/home/temp 10.avi|/home/p2.avi|/home/temp15.avi",
"-c",
"copy",
"-y",
"/home/output.avi"
}
)
下面評論中的示例如下所示
Runtime.getRuntime().exec(
new String[] {
"ffmpeg",
"-i",
"sample.mp4",
"-i",
"ad.mp4",
"-filter_complex",
"[0:v]trim=0:15,setpts=PTS-STARTPTS[v0]; [1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; [0:v]trim=20:30,setpts=PTS-STARTPTS[v2]; [v0][v1][v2]concat=n=3:v=1:a=0[out]",
"-map",
"[out]",
"output.mp4"
}
)
-filter_complex
之后的大字符串是單個參數,因為它在命令的shell版本中引用。 它有一個不包含字符是特殊的之間""
的外殼,並沒有字符是特殊的之間""
在Java中,因此它可以無需修改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.