Проблема GStreamer 1.16.0, связывающая tsdemux с h264parse - PullRequest
0 голосов
/ 25 сентября 2019

Итак, это работает:

gst-launch-1.0 filesrc location=Truck.H264 ! tsdemux ! h264parse ! avdec_h264 ! xvimagesink

И это работает:

GstElement* pipeline = gst_parse_launch_full(
        "gst-launch-1.0 filesrc location=Truck.H264 ! tsdemux ! h264parse ! avdec_h264 ! xvimagesink",
        NULL, GST_PARSE_FLAG_NONE, NULL );

Но это не работает:

GstElement* pipeline = gst_pipeline_new(nullptr);
GstElement* filesrc = gst_element_factory_make("filesrc", nullptr);
g_object_set( G_OBJECT(filesrc), "location", "Truck.H264", NULL);
GstElement* tsdemux = gst_element_factory_make("tsdemux", nullptr);
GstElement* h264parse = gst_element_factory_make("h264parse", nullptr);
GstElement* avdec_h264 = gst_element_factory_make("avdec_h264", nullptr);
GstElement* xvimagesink = gst_element_factory_make("xvimagesink", nullptr);
gst_bin_add_many(GST_BIN(pipeline), filesrc, tsdemux, queue, h264parse, avdec_h264, xvimagesink, nullptr);
gst_element_link_many(filesrc, tsdemux, h264parse, avdec_h264, xvimagesink, nullptr);

Теперь в моем неопытном умеони все одинаковы и должны работать одинаково.Я думаю, что нет.

Поэтому я разбил ссылку на отдельные этапы и обнаружил, что проблема здесь:

gst_element_link(tsdemux, h264parse);

Я подумал, что gst_element_link не такой умный в gst_parse_launch_full и не делаетЯ знаю, какие пэды подключать, поэтому я попытался:

gst_element_link_pads(tsdemux,"video_%01x_%05x", h264parse, "sink");

И:

GstCaps* caps=gst_caps_new_simple("video/x-h264",
        "stream-format",G_TYPE_STRING,"byte-stream",
        "alignment",G_TYPE_STRING,"nal",
        nullptr);
gst_element_link_filtered(tsdemux, h264parse, caps);

Но это не сработало.

Я пытался вставить очередь между tsdemuxи h264parse, но затем ошибка переместилась на связывание tsdemux и очереди:

gst_element_link(tsdemux, queue);

Я думал, что могу связать что-нибудь с очередью.Наверное, нет.

Я попробовал некоторые другие глупости, которые, как я думал, не сработали, и они не сработали, и теперь у меня нет идей.

Возможно, мне не хватает того, что знает каждый программист gstreamer.Если вы один из них, не могли бы вы поделиться им со мной?

1 Ответ

0 голосов
/ 26 сентября 2019

ОК, сегодня я немного мудрее.Смущающая часть состоит в том, что я прочитал это в документации и не осознал важность этого.

Ответ заключается в том, что не все элементы создаются с помощью их пэдов.Иногда прокладки создаются динамически, когда они необходимы.Важной частью является то, что я не могу связать элемент, пока не будут созданы его пэды.Поэтому для этого мне нужно было создать функцию для связывания элементов, когда панель сделана следующим образом:

static void linkElements(GstElement* element,GstPad* sourcePad, gpointer sinkElement){
    GstPad* sinkPad=gst_element_get_static_pad((GstElement*)sinkElement,"sink");
    gst_pad_link(sourcePad,sinkPad);
    gst_object_unref(sinkPad);
}

Затем я заменил команду элемента ссылки:

gst_element_link(tsdemux, h264parse);

накоманда, которая вызовет мою функцию linkElements, когда генерируется событие «добавлено pad»:

g_signal_connect(tsdemux,"pad-added",G_CALLBACK(linkElements),h264parse);
...