2016-08-11 8 views
0

複数のgstreamerプロセスを同時に実行している場合、appsrcからfilesinkへの保存に問題があります。 gstreamerプロセスのうちの1つだけが正しく書込みを行い、他のプロセスはすべて空のファイルをほとんど書き出します。 filesink操作中に競合を書き込むように見えます。appsrcから複数のファイルシンクを同時に書き込めません

注:MAC OS 10.11.6でpython3(v3.5.2)でgstreamer1.0(v1.8.2)を使用しています。

を背景に、私は、単一のビデオストリームからフレームを読み取るサイズ1920x800x3のBGRのnumpyのアレイに各フレームに変換し、循環バッファ内の各フレームを格納しています:ここで

は私のコードが実際にやっているものです。私は、この循環バッファからフレームを読み込み、フレームをバイトストリームに変換し、このストリームをappsrcに送り込む "gstreamer_writer関数"を構築しました。

これは、新しいマルチプロセス(multiprocessing.Process)をインスタンス化し、これを "gstreamer_writer関数"に指定することで機能します。これは、単一のマルチプロセス/ファンクションコールに対して完全に正常に機能します。 Appsrcが正しくバイトストリームを供給し、私は次のGStreamerのパイプラインを使用してH264エンコードでMP4にこれらのBGRフレームを保存します

appsrc format=3 name=app emit-signals=true do-timestamp=true is-live=true blocksize=4608000 max-bytes=0 caps=video/x-raw,format=BGR,width=1920,height=800 ! videoconvert ! video/x-raw,format=I420,width=1920,height=800 ! vtenc_h264 ! mp4mux ! filesink location=test1.mp4 

しかし、私は2つ以上のmultiprocessesをインスタンス化し、機能での唯一のそれらを指している場合ファイルが正常に動作します。たとえば、「test1.mp4」に書き込んでいて、もう一方が「test2.mp4」に書き込んでいる場合、動画のいずれかが正しく書き込まれ、もう一方が失敗してほぼ空のmp4(〜500kb)が書き込まれます。常に同じmp4ではなく、test1.mp4が正しく書き込まれ、test2.mp4の時間の50%が正しく書き込まれる時間の50%です。何らかの種類の競合状態や書き込み競合があり、両方のmp4が正しくファイルに書き込まれないように見えます。

注意すべきことは、各マルチプロセスが同じリングバッファから同じフレームにアクセスしていることです。私はこれがgstreamerに問題を引き起こしている可能性があると考えました。しかし、ファイルに書き込むのではなく、autovideosinkでストリームを表示すると、私は好きなだけストリーム/マルチプロセスを表示できます。これは、データがパイプラインを正しく通過しており、書き込み段階でのみ失敗していることを意味します。誰もが私はそれを感謝し、この問題を解決する方法のための任意の提案を持っている場合

appsrc format=3 name=app emit-signals=true do-timestamp=true is-live=true blocksize=4608000 max-bytes=0 caps=video/x-raw,format=BGR,width=1920,height=800 ! videoconvert ! video/x-raw,format=I420,width=1920,height=800 ! vtenc_h264 ! avdec_h264 ! autovideosink 

:私はgstreamerのコマンドを使用して、これをテストしました。私はそれが簡単な変更だと思っていますが、あなたはgstreamerを知らないでしょう!

ありがとうございます!

答えて

0

コメントをあまりにも長い間、私は正しいだ場合、これはあなたの問題を解決することができます。..

filesink前にキューを追加します。

appsrc format=3 name=app emit-signals=true do-timestamp=true is-live=true blocksize=4608000 max-bytes=0 caps=video/x-raw,format=BGR,width=1920,height=800 ! videoconvert ! video/x-raw,format=I420,width=1920,height=800 ! queue ! vtenc_h264 ! mp4mux ! queue ! filesink location=test1.mp4 

キューには2つの機能があります。 +要素を消費する前にバッファを作ります(エンコーダーは - エンコーディングを開始する前に多くのフレームを必要とします) +新しいスレッドに別の処理を別にして、filesinkが新しいスレッドでデータを処理するようにします。

HTH

+0

お返事ありがとうございました@otoplsky!残念ながら、これら2つのキューを追加しても問題は解決しませんでした。 1つのプロセスがすぐにファイルへの書き込みを開始し、もう1つのプロセスが0MBでの書き込みを開始します。 エラー:GST_PADS gstpad.c:3279:gboolean gst_pad_query_latency_default(GstPad *、GstQuery *):最大レイテンシを超える最小レイテンシが発生しました。 私はいつでも起動時に次のエラーが発生します。 vtenc vtenc.c:807:gst_vtenc_create_session: VTCompressionSessionCreate()が返されました:-12915 –

関連する問題