2016-12-21 8 views
1

Я попытался воспроизвести видео, закодированное в h264, и мультиплексироваться с matroskamux, но я не могу этого добиться. Я на встроенной платформе, iMX6.Gstreamer: mastroskamux error: not connected

Мой трубопровод работает с GST-Lauch:

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

Я создал его в C, но это не работает. Я удалил обработку ошибок, я использовать структуру rep, содержащую все элементы:

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); 

видео не отображается, и приложение застревает. С GST_DEBUG = 4 Я получаю много отладки, но в последних строках:

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 

Я пытался заставить увязывание колодки Demuxer, потому что у него есть «иногда» исходный пэд.

Я не знаю, как действовать, чтобы заставить его работать. Спасибо за помощь.

EDIT: Файл журнала here. Это проблема связывания, я не знаю, как ее решить.

+0

Возможно, колпачки не совпадают. Может быть, в матроске больше треков? Попробуйте GST_DEBUG = 5 и переадресуйте журнал в файл. Есть много вещей, которые могут объяснить, что происходит. Я могу заглянуть в журнал. – peper0

+0

@ peper0 Спасибо за ответ, я редактировал свой пост с журналом. – PierreOlivier

+0

Какой именно ваш конвейер был во время запуска, который вы зарегистрировали? [EDIT] Извините, я думал, что это журнал из gst-launch. Теперь я вижу, что это от кода, который вы приложили. – peper0

ответ

2

Проблема заключается в том, что у 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); 
} 

Я Бесполезный Не проверяйте, компилируется ли мой код, но я уверен, что вы поймаете идею.

Вас также может заинтересовать this example.

BTW, gst-launch использует интеллектуальные механизмы, которые поддерживают такое отсроченное соединение. В коде вы должны сделать это вручную.

+0

Это сработало, спасибо большое! – PierreOlivier

 Смежные вопросы

  • Нет связанных вопросов^_^