2017-01-12 11 views
0

以下の要素を使用してTeeでGStreamerパイプラインを実装しようとしています。2つのシンクを含むTeeを含むGStreamerパイプラインが失敗する

gst_bin_add_many(GST_BIN (pipeline), <rpicamsrc>, <capsfilter>, <h264parse>, tee, <queue>, <rtph264pay>, <fakesink>, <queue>, <avdec_h264>, <videoconvert>, <capsfilter>, <customplugin>, <fakesink>, nullptr); 

わかりやすくするために、要素名を提供しました。

rpicamsrc ! capsfilter ! h264parse ! tee name=t t. ! queue ! rtph264pay ! fakesink t. ! queue ! avdec_h264 ! videoconvert ! capsfilter ! customplugin ! fakesink 

しかし、これは常に失敗し、エラーは報告されません。しかし、ビデオフレームはキャプチャされません。いくつかのテストでも、この単純なパイプラインのために失敗したことが確認された後:

gst_element_link_many (<rpicamsrc>, <capsfilter>, <h264parse>, <rtph264pay>, <fakesink>, nullptr)) 

興味深い、私はそれが動作するコードのgst_bin_add_manyライン以上のことから、第二fakesinkを削除する場合です。これで何が問題なのかよく分かりません。 autovideosinkのような別のシンクを使用しようとしましたが運がありません。それが失敗すると、gstメッセージタイプGST_MESSAGE_ASYNC_DONEがgstバスに受信されませんが、成功ケースの場合は実行されます。 GST_STREAM_STATUS_TYPE_CREATEGST_STREAM_STATUS_TYPE_ENTERGST_MESSAGE_STREAM_STARTは、失敗と成功事例の両方を取得します。私は何を間違えているのですか?

+0

ターミナルでgst-launchを使用してパイプラインを実行し、GST_DEBUG = 4に設定してログを取得してください。 – cxphong

答えて

0

gst_element_link_many()は、非分岐パイプラインのための便利なラッパーです。つまり、次から次へとリンクします。パイプラインの途中にあるtee要素を複数の要素にリンクさせたいということはわかりません。たとえば、あなたのケースでは、fakesinkをパイプラインの途中のqueueに接続しようとします。

簡単な方法

あなたはGStreamerのは、何にリンクするかを把握できるようにgst_parse_launch()を使用することができます。

あなたの手によって

あなたはteeのような要素を持っている場合は、どの要素がこれに接続することをGSreamerを伝えるためにgst_element_link()またはgst_element_link_pads()を使用する必要があります。

gst_element_link_many()で2つのパイプラインを作成することが可能である

rpicamsrc → capsfilter → h264parse → tee → queue → rtph264pay → fakesink 

queue → avdec_h264 → videoconvert → capsfilter → customplugin→ fakesink 

、次いで、gst_element_link_pads()と下に上記でtee要素をリンクします。

関連する問題