GStreamer - конвейер, как подключить filesr c к qmlglsink - PullRequest
0 голосов
/ 05 августа 2020

Я новичок в мире GStreamer, поэтому не могу понять, как это работает и как объединить все GstElements.

Я хочу объединить видео (например, mp4 или любой другой видео формат) с qml (из Qt) в качестве наложения. Этот пример отлично работает.

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

Но в этом примере в качестве источника используется videotestsrc, я бы предпочел использовать что-то вроде filesrc. Я пробовал этот код:

GstElement *pipeline = gst_pipeline_new (NULL);

GstElement *src = gst_element_factory_make ("filesrc", "file-source");
GstElement *parser = gst_element_factory_make("h264parse",NULL);
GstElement *decoder = gst_element_factory_make("avdec_h264",NULL);
GstElement *colors = gst_element_factory_make("glcolorconvert",NULL);

GstElement *glupload = gst_element_factory_make ("glupload", NULL);
GstElement *sink = gst_element_factory_make ("qmlglsink", NULL);

g_assert (src && parser && decoder %% colors && glupload && sink);

g_object_set (G_OBJECT (src), "location", "file:///home/test.mp4", NULL);

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

Он компилируется, но на выходе получается просто черный экран.

Поскольку я не уверен, как работает конвейер GStreamer, я попробовал это.

Сначала получите файл из памяти с помощью filesrc, затем проанализируйте его с помощью h265parse и декодируйте с помощью avdec_h264. Затем отправьте это (я думаю, необработанные несжатые данные) в glupload и сделайте цвета хорошими с помощью glcolorconvert, поскольку qmlglsink использует RGBA , а avdec_h264 - I420 . После того, как цвета настроены, отправьте его на qmlglsink для отображения в qml.

Мне что-то не хватает, и я не знаю, как связать GstElemnts, как я сказал, мне нужно связать filesrc (любой формат видео) и qmlglsink.

1 Ответ

0 голосов
/ 05 августа 2020

Проще использовать bin или любой из автоподключаемых модулей GStreamers.

Но главная проблема здесь в том, что вы пытаетесь рассматривать файл MP4 как поток H.264. Так не может быть. Вам необходимо демультиплексировать медиапотоки из вашего контейнера.

Например, конвейер должен быть примерно таким:

gst-launch-1.0 filesrc location=/home/test.mp4 ! qtdemux ! \
h264parse ! avdec_h264 ! glupload ! glcolorconvert ! qmlglsink
...