簡體   English   中英

Java執行命令在代碼中不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM