3

Javaアプリケーション内からVideoLANプログラムのインスタンスを起動しようとしています。私がこれを試みた方法の1つをここに示します。

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プログラムが起動し、ストリーミング操作が開始されます(接続、バッファリング、ストリーミングの各フェーズを経ます)。

コマンドがRuntimeexec(またはProcessBuilder start)によって実行されると、バッファリングフェーズの終わりに達したときにvlcプログラムがハングします。Javaプログラム内のすべてのスレッドが終了/最後まで実行されると、vlcプログラムはストリーミングフェーズに進みます。javaプロセスは、vlcプロセスが閉じられるまで終了しないため、この動作は明らかに、プロセス間の何らかの結合の結果です。

コマンドを.cmdファイルに書き込んでから実行することにより、間接的にコマンドを実行しようとしましたが、同じ動作になります。

外部プロセスのハングを回避する方法についてのアイデアはありますか?

4

2 に答える 2

7

うーん、私の推測では、STDOUTがそのバッファが空になるのを待っているため、VLCがSTDOUTバッファをいっぱいにし、printfステートメントでハングしていると思います。

プロセスの出力用のストリームを取得して読み取る必要があります(破棄した場合でも)。

この記事を読むことをお勧めします

4ページ目は、子プロセスがブロックされないようにスレッド内のストリームを読み取る方法の良い例です。

于 2009-12-05T01:15:19.840 に答える
0

このサイトは素晴らしいです:)。どういうわけか、私がすでに試みたと思っていたアプローチが突然働き始めました。

問題は、vlcがそのstdErrOut(プロンプトで実行されたときに表示されない)に書き込むことです。次に、出力バッファがいっぱいになるとブロックします。解決策は、stdErrをstdOutにリダイレクトしてから、スレッドにプロセスオブジェクトの入力ストリームを空にすることです。

ただし、かなりの量の外部プロセスが必要であり、入力ストリームでノンブロッキングI / Oを実行できないため、これは最適なソリューションではありません。タイマーサービスドライブを空にして、いくつかのプロセスを読み取ることを少し実験します。この問題を回避するためにプロセスを分離する方法に関する他の提案は大歓迎です。

于 2009-12-05T01:13:53.307 に答える