2009-12-05 60 views
2

我試圖從Java應用程序內啓動VideoLAN程序的實例。其中一個我試圖做到這一點的方法如下所示:由運行時運行時的外部程序塊exec

Process p = Runtime.getRuntime().exec("\"C:\\Program Files\\VideoLAN\\VLC\\vlc.exe\" \"http://www.dr.dk/Forms/Published/PlaylistGen.aspx?qid=1316859&odp=true\" :sout=#std{access=udp,mux=ts,dst=127.0.0.1:63928}"); 

如果我執行上面的命令,VLC程序將啓動,並開始流操作(它通過連接,緩衝和再流媒體階段)。

當Runtime exec(或ProcessBuilder start)執行該命令時,當vlc程序到達緩衝階段結束時,它將掛起。如果Java程序中的所有線程都被終止/運行到結束,那麼vlc程序將進入流式處理階段。 java進程在vlc進程關閉之前不會終止,所以這種行爲顯然是進程間某種耦合的結果。

試圖通過將它寫入.cmd文件並執行它來間接執行該命令,但結果相同。

有關如何避免外部過程掛起的任何想法?

+0

您希望在VLC打開的情況下讓Java進程保持運行,還是讓它終止並讓VLC進程繼續運行?我不確定實際上是否有「耦合」發生,因爲這個過程運行在它自己的空間中,但是也許有一些過程控制可以幫助你獲得你想要的結果。 – jheddings 2009-12-05 01:09:20

回答

5

嗯,我的猜測是VLC會填滿你的STDOUT緩衝區,並掛在一個printf語句中,因爲STDOUT正在等待該緩衝區清空。

您需要獲取流的輸出流並讀取它(即使丟棄它)。

我建議你閱讀這篇article

在第四頁是如何讀取線程的視頻流,以便你的孩子的過程不會阻止一個很好的例子。

0

這個網站是太棒了:)。出於某種原因,我認爲已經嘗試過的方法突然開始工作。

問題是,vlc寫入其stdErrOut(在提示中執行時不可見)。然後一旦某個輸出緩衝區滿了,它就會被阻塞一個解決方案是將stdErr重定向到stdOut,然後讓一個線程清空過程對象的輸入流。

然而,這不是一個最佳解決方案,因爲我需要相當數量的外部進程,並且您不能在其輸入流上執行非阻塞I/O。稍後將嘗試一下,讓計時器服務驅動器讀取多個進程的空讀數據。其他有關如何分離過程以避免此問題的建議非常受歡迎。