2016-12-21 23 views
1

私はh264でエンコードされたビデオを再生しようとしましたが、matroskamuxで多重化しましたが、実現できません。私は組み込みプラットフォーム、iMX6です。Gstreamer:mastroskamuxエラー:リンクされていません

GST-だせと私のパイプライン工事:

gst-launch-1.0 filesrc location=video.mkv ! matroskademux ! h264parse ! imxvpudec ! imxipuvideosink 

私はCでそれを作成したが、それは動作しません。

rep->pipeline = gst_pipeline_new("pipeline"); 
rep->src = gst_element_factory_make("filesrc","source0"); 
rep->demux = gst_element_factory_make("matroskademux","demux0"); 
rep->queue = gst_element_factory_make("queue2","queue0"); 
rep->parser = gst_element_factory_make("h264parse","parser0"); 
rep->decoder = gst_element_factory_make("imxvpudec","dec0"); 
rep->sink = gst_element_factory_make("imxipuvideosink","sink0"); 
gst_bin_add_many (GST_BIN(rep->pipeline), rep->src, rep->demux, rep->queue, rep->parser, rep->decoder,rep->sink, NULL); 
g_object_set(rep->src, "location", "video.mkv", NULL); 
g_object_set(rep->sink, "use-vsync", TRUE, NULL); 
gst_element_link_many(rep->src, rep->demux, rep->queue, rep->parser, rep->decoder, rep->sink, NULL); 
g_print("start pipeline\n"); 
gst_element_set_state (rep->pipeline, GST_STATE_PLAYING); 
g_main_loop_run (loop); 

ビデオが表示されず、アプリケーションがスタックしている:私は、私はすべての要素を含む構造repを使用して、エラー処理を削除しました。 = 4 GST_DEBUGで、私はデバッグの多くを得るが、最後の行に:それは「時々」ソースパッドを持っているので、

0:00:00.168590667 577 0xe24c0 WARN   matroskademux matroska-demux.c:4500:gst_matroska_demux_loop:<demux0> error: stream stopped, reason not-linked 
0:00:00.168777333 577 0xe24c0 INFO  GST_ERROR_SYSTEM gstelement.c:1835:gst_element_message_full:<demux0> posting message: GStreamer encountered a general stream error. 
0:00:00.169084667 577 0xe24c0 INFO  GST_ERROR_SYSTEM gstelement.c:1858:gst_element_message_full:<demux0> posted error message: GStreamer encountered a general stream error. 
0:00:00.169268000 577 0xe24c0 INFO     task gsttask.c:300:gst_task_func:<demux0:sink> Task going to paused 

私は、デマルチプレクサのパッドのリンクを強制しようとしました。

私はそれが動作するように進める方法がわかりません。 助けてくれてありがとう。

EDIT: ログファイルhere。 リンクの問題です。解決方法はわかりません。

+0

おそらくキャップが一致しません。多分、マトスカにはもっと多くのトラックがあるでしょうか? GST_DEBUG = 5を試して、ログをファイルにリダイレクトしてください。何が起こっているのかを説明するかもしれない多くのものがある。私はログを調べることができます。 – peper0

+0

@ peper0答えをくれてありがとう、私はログで私の投稿を編集しました。 – PierreOlivier

+0

あなたが記録した実行中に正確にあなたのパイプラインは何ですか? [編集]申し訳ありませんが、私はそれがgst-launchからのログだと思いました。今すぐあなたが添付したコードからのものです。 – peper0

答えて

2

問題は、あなたがそれをリンクするためにtryinkしているとき、demuxがNULL状態のソースパッドを持っていないことです。この時点で入力ファイルの処理が開始されるため、Demuxは出力パッドをPAUSED状態で追加します。したがって、最初にリンクしてから開始することはできません。

あなたはこのような何かを持つデマルチプレクサの「オンパッドを追加」イベントに接続する必要があります:

g_signal_connect (rep->demux, "pad-added", G_CALLBACK (on_pad_added), rep->queue); 

、適切on_pad_added関数を記述、次のように:

void 
on_pad_added (GstElement *element, 
       GstPad  *pad, 
       gpointer data) 
{ 
    GstPad *sinkpad; 
    GstElement *queue = (GstElement *) data; 

    g_print ("Dynamic pad created, linking demuxer/decoder\n"); 

    sinkpad = gst_element_get_static_pad (queue, "sink"); 

    gst_pad_link (pad, sinkpad); 

    gst_object_unref (sinkpad); 
} 

私はdidnの私のコードがコンパイルされているかどうかをチェックしていますが、あなたはアイデアをキャッチしています。

this exampleにも興味があります。

ところで、gst-launchは、このような遅延リンクをサポートするスマートな機械を使用しています。コードでは、手動で行う必要があります。

+0

それは働いて、ありがとう! – PierreOlivier

関連する問題