Я новичок в мире 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
.