2011-01-04 18 views
0

私はサーバーでビデオエンコーディングのアプリケーションを開発していましたが、MEncoderでビデオをエンコードする際に問題がありました。MEncoderでサーブレットによるビデオエンコーディング

Runtime.getRuntime().exec(“D:\mencoder\mnc\mencoder.exe video1.avi -o outvideo1.flv -of lavf -oac mp3lame -lameopts abr:br=64 -srate 22050 -ovc lavc -lavcopts vcodec=flv:vbitrate=300:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240,harddup -quiet”) ; 

デコーダが起動して、コマンドラインでrunned、私のパラメータを使用してWindowsコンソールで動作する場合、このデコーダが正しく動作しませんが、それは、サーブレットから実行だとき、それは単にプロセスリストでハングしていませんWebサーバーが停止する前に何かをしてください。シンプルなJavaアプリケーションからデコーダを使用しようとすると、正しく動作します。手伝ってくれてありがとう。

答えて

1

これは間違いなくこれを行う悪い方法です。一般に、mencoderはユーザーが待ち望んでいるよりもはるかに時間がかかります。また、mencoderがメモリをリークしたり、クラッシュすると、jvm全体がダウンする危険があります。また、生成されるプロセスの数を制御することもできません。よりよい解決策は、jmsキューまたは挿入するデータベースを持つことです。次に、それらを選んでそれらのビデオを処理する別のバッチジョブがあります。データベースアプローチを使用する場合は、進行状況に応じてデータベースを更新し、進行状況の統計情報を最新の状態に保つことができます。一般に、この種のランタイム実行をWebアプリケーションコンテナから外してください。

+0

は、ユーザーの期待はそれほど重要ではありません。このプロセスは、十分な量のデータがあると自動的に実行されます。特定の数のユーザーが低品質または高品質のビデオを必要とする場合、ビデオは元のものから所望のビットレートで変換され、視聴またはダウンロードのためにユーザーに提供されます。この場合、主な問題は、Mencoderアプリケーションの不明な理由による失敗です。 – Andrew

0

MPlayerが端末にたくさんのものを出力し、出力が4096バイトに達すると(Linuxではパイプバッファ制限)、データが読み込まれるまでプロセスは次のprintfでハングしますパイプの反対側にある。そして、あなたのケースでは、スタンドアット出力とエラーストリームを読んでいないので、それは永遠にハングアップします。あなたは、プロセス起動とあなたは同じようにすぐにこれらのストリームを閉じることができますこれを回避するために
:この場合

Process p = Runtime.getRuntime().exec(“D:\mencoder\mnc\mencoder.exe video1.avi -o outvideo1.flv -of lavf -oac mp3lame -lameopts abr:br=64 -srate 22050 -ovc lavc -lavcopts vcodec=flv:vbitrate=300:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240,harddup -quiet”) ; 
p.getInputStream().close(); 
p.getOutputStream().close(); 
p.getErrorStream().close(); 
関連する問題