2010-09-18 66 views
4

運行ffmpeg的命令運行從Java調用Runtime.getRuntime一個ffmpeg的命令()。EXEC。 ffmpeg命令基本上從直播流中剪切圖像。 其實當我運行這個命令沒有&時,它在五分鐘後正常工作,它停止剪切圖像。我如何在後臺從Java

但是當我的ffmpeg命令使用「&」這並不在所有的工作。

存在實時數據流爲當我跑在Linux它工作正常此ffmpeg的命令沒有問題。

我的主要問題是如何從Java後臺運行ffmpeg的命令。

+0

ffmpeg命令工作正常在php – jack 2010-09-18 08:41:27

回答

0

你寫它停止分鐘後工作。你有沒有檢查退出代碼(Process.exitValue())。另外,你是否從外部進程檢查輸出流和錯誤流?

+0

測試中沒有任何東西..我猜測它掛了五分鐘後 – jack 2010-09-19 12:33:55

3

'&'是一個shell指令將任務放到後臺。從Process.exec()運行不涉及shell。

如果進程停滯不前(即運行,但只是不工作),那麼我懷疑它的阻塞等待你消耗標準輸出/標準錯誤。您必須使用線程來執行此操作,以防止進程阻塞等待您使用其輸出。有關更多詳細信息,請參閱this SO answer

要在後臺運行(即同時你的Java程序做其他的東西),你需要:

  1. 產生一個新的線程
  2. 在這個線程
  3. 消耗標準輸出通過Process.exec調用流程/ stderr(都在單獨的線程中),最後得到退出代碼
+0

我測試過的線程也.. ..但結果仍然相同。 如何將任務放入後臺意味着如何使用「&」 – jack 2010-09-19 12:31:38

0

您是否將參數傳遞給數組?如果它在一段時間內有效,你是否將所有預期的論點都給了它? (打印出來並檢查)。這是我爲你挖出的ffmpeg的一個例子。

String[] ffmpeg = new String[] {"ffmpeg", "-ss", Integer.toString(seconds),"-i", in, "-f", "image2", "-vframes", "1", out}; 
Process p = Runtime.getRuntime().exec(ffmpeg); 
+0

/usr/sites/ffmpeg -i livestream -r4 folderpth/image%d.jpeg – jack 2010-09-18 10:41:31

+0

您是否嘗試將參數作爲字符串列表傳遞?在原始問題中發佈一些代碼,向我們展示您擁有的內容。我上面的代碼獲取輸入文件的時間和輸出圖像的整數參數。 – dekz 2010-09-18 11:37:58

+0

這裏是示例代碼.. String cmd =「/ usr/sites/ffmpeg -i」+ livestream +「-r4」+ folderpth +「/ image%d.jpeg」; try { Process p = Runtime.getRuntime()。exec(cmd); } catch {} – jack 2010-09-18 19:40:42

0
String livestream = "/Users/videos/video_10/video_1.mp4"; 

String folderpth = "/Users/videos/video_10/photos"; 

String cmd="/opt/local/bin/ffmpeg -i "+ livestream +" -r 10 "+folderpth+"/image%d.jpeg"; 

Process p = Runtime.getRuntime().exec(cmd); 

視頻是10秒。很長,它創建了100 jpeg的照片文件夾。您必須提供文件夾的絕對路徑。

還要在終端中找到ffmpeg二進制使用的路徑which ffmpeg。我的是/opt/local/bin/ffmpeg

1

我知道你在尋求幫助你的命令行問題在Java,但你可能會對其他解決方案感興趣。

也許你可以試用一下這個庫: http://code.google.com/p/jjmpeg/

它是ffmpeg的一個包裝。 也許你可以嘗試創建一個Java線程並運行你的命令。