GStreamer: конвейер работает в команде gst-launch-1.0, но не в коде c ++ - PullRequest
0 голосов
/ 02 апреля 2019

На моем клиенте запущен конвейер:

gst-launch-1.0 tcpclientsrc port=3344 host=10.0.0.7 ! tsdemux ! h264parse ! avdec_h264 ! autovideosink

, который работает отлично. Сейчас я пытаюсь преобразовать его в программу на С ++, которая отображает его в виджете Qt с помощью qmlglsink.

Я понял следующий тестовый код, который работает для меня:

GstElement *pipeline = gst_pipeline_new(NULL);
GstElement *src = gst_element_factory_make("videotestsrc",NULL);
GstElement *glupload = gst_element_factory_make("glupload",NULL);
GstElement *qmlglsink = gst_element_factory_make("qmlglsink",NULL);

g_assert(src && glupload && qmlglsink);

gst_bin_add_many(GST_BIN(pipeline), src, glupload, sink);
gst_element_link_many(src, glupload, sink, NULL);

Теперь я попытался преобразовать другой конвейер таким образом:

GstElement *pipeline = gst_pipeline_new(NULL);
GstElement *src = gst_element_factory_make("tcpclientsrc",NULL);
GstElement *demuxer = gst_element_factory_make("tsdemux",NULL);
GstElement *parser = gst_element_factory_make("h264parse",NULL);
GstElement *decoder = gst_element_factory_make("avdec_h264",NULL);
GstElement *glupload = gst_element_factory_make("glupload",NULL);
GstElement *qmlglsink = gst_element_factory_make("qmlglsink",NULL);

g_assert(src && demuxer && parser && decoder && glupload && qmlglsink);

g_object_set(G_OBJECT(src), "host", "10.0.0.7", NULL);
g_object_set(G_OBJECT(src), "port", 3344, NULL);

gst_bin_add_many(GST_BIN(pipeline), src, demuxer, parser, decoder, glupload, sink);
gst_element_link_many(src, demuxer, parser, decoder, glupload, sink, NULL);

Но когда я запускаю последний конвейер, он ничего не делает. Нет ошибок, но нет видеопотока. Я думаю, что что-то упустил с командами ссылки. Пожалуйста, помогите и скажите мне, что я делаю неправильно.

1 Ответ

1 голос
/ 02 апреля 2019

Нет ошибок?Вы опрашиваете шину трубопровода для сообщений об ошибках?Запускаете ли вы приложение с GST_DEBUG=3 для проверки подсказок?

Но, просто взглянув на него, я предполагаю, что avdec_h264 будет иметь I420 в качестве выходного формата видео, а qmlglsink требует RGBA формат,Итак, вам не хватает преобразователя цветового пространства.Так как вы все равно загружаете в GL, я бы порекомендовал использовать glcolorconvert.

Так что измените свой код, чтобы создать конвейер следующим образом: .. ! glupload ! glcolorconvert ! qmlglsink

...