Gstreamer: mastroskamux ошибка: не связано

Я пытался воспроизвести видео, закодированное в h264 и мультиплексированное с помощью matroskamux, но не могу этого добиться. Я на встроенной платформе, iMX6.

Мой конвейер работает с 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

Я попытался принудительно связать пэды демультиплексора, потому что у него есть "иногда" пусковая площадка источника.

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

РЕДАКТИРОВАТЬ: файл журнала здесь. Это проблема со связью, я не знаю, как ее решить.

1 ответ

Решение

Проблема в том, что у demux нет исходных панелей в состоянии NULL, когда вы пытаетесь связать его. Demux добавляет выходные поля в состоянии PAUSED, поскольку в этот момент начинается обработка входного файла. Поэтому вы не можете просто связать его в начале, а затем начать.

Вы должны подключиться к событию "on-pad-Added" демультиплексора примерно так:

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

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

Вы также можете быть заинтересованы в этом примере.

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

Другие вопросы по тегам