【发布时间】:2020-08-05 15:20:39
【问题描述】:
我是 GStreamer 领域的新手,所以我不知道它是如何工作的,以及如何配对所有 GstElement。
我想将视频(例如 mp4 或任何其他视频格式)与 qml(来自 Qt)合并为叠加层。 This example 工作得很好。
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。
【问题讨论】:
标签: c++ qt qml gstreamer gstreamer-1.0