2012-03-26 46 views
5

因此,我正在構建一個將.flv文件轉換爲其他格式的程序。 爲此,我使用ffmpeg,它在通過命令行執行時完美地完成了它的工作。例如:外部命令沒有完全執行 - Java

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

這個例子就像一個魅力 - 在執行命令時,沒有一個單一的問題。

但是,當我嘗試從Java類中執行相同的命令時發生問題。我這樣做是在try-catch塊:

System.out.println("Start"); 
Process p = Runtime.getRuntime().exec("cmd /c ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3"); 
System.out.println("End"); 

控制檯打印 「開始」。它開始轉換,並沒有完成。
有人可以幫助我嗎?

+0

它是否也打印「結束」? – Nerdtron 2012-03-26 12:16:36

+0

在C:\ test中的\ t將作爲C: est傳遞,順便說一句......您需要轉義反斜槓。 – 2012-03-26 12:17:34

+0

'ffmpeg'肯定不是'DOS'命令。這是一個命令行程序。 – 2012-03-26 12:35:15

回答

5

那麼,這個問題是以非常意想不到的方式解決的。我只需讀取執行產生的輸出。並且,瞧,文件被轉換了。

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

兩個問題:

  1. cmd /c ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3不是命令。 (您可能最終會得到一個IOException,這會導致"End"被抑制。)

    cmd是要執行的命令,而其餘的字符串是參數。使用ProcessBuilderRuntime.exec(String[] cmdarray)

  2. 您需要等待該過程完成。打電話

    p.waitFor(); 
    

    開始過程後。這是Process.waitFor文檔的鏈接。

+0

你說得對,雖然我懷疑其他地方可能有些不妥。目前程序*不應該等待進程,所以應該立即將「End」打印到控制檯 – 2012-03-26 12:16:46

0

您是否嘗試過控制字符串,像:

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

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

首先,這不是一個DOS命令這是一個控制檯命令線,從任何味微軟視窗

你可以做到這一點按照@aioobe的說明使用p.waitFor(),或者您可以使用FFMPEG的包裝器Java API(如Xuggler),它很容易使用,並且它具有LGPL。