我是GStreamer世界的新手,所以我不知道它是如何工作的,以及如何配对所有GstElements。
我想合并视频(例如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
。
3条答案
按热度按时间zy1mlcev1#
你可以像下面这样试试
字符串
ubbxdtey2#
如果您还没有,则需要将状态设置为playingwith
gst_element_set_state(m_video_pipeline, GST_STATE_PAUSED);
nlejzf6q3#
使用
bin
或任何GStreamers自动插件都更容易。但这里的主要问题是您尝试将MP4文件视为H.264流。这样不行您需要从容器中解复用媒体流。
例如,管道应该是这样的:
字符串