GStreamer - 管道如何将 filesrc 连接到 qmlglsink

问题描述 投票:0回答:3

我是 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

c++ qt qml gstreamer gstreamer-1.0
3个回答
1
投票

你可以像下面这样尝试

    MediaPlayer{
        id: playVideo
        source: "gst-pipeline: filesrc location=/home/root/skim-debris.mp4 ! qtdemux ! avdec_h264 ! qtvideosink"
        autoLoad: true
        autoPlay: true
        playbackRate: 1.0
        loops: 10
    }

    VideoOutput {
        anchors.fill: parent
        source: playVideo
    }

0
投票

如果还没有,您需要将状态设置为正在玩

gst_element_set_state(m_video_pipeline, GST_STATE_PLAYING);


-1
投票

使用

bin
或任何 GStreamers 自动插入器会更容易。

但这里的主要问题是您尝试将 MP4 文件视为 H.264 流。这是不可能的。您需要从容器中分离媒体流。

例如管道应该是这样的:

gst-launch-1.0 filesrc location=/home/test.mp4 ! qtdemux ! \
h264parse ! avdec_h264 ! glupload ! glcolorconvert ! qmlglsink
© www.soinside.com 2019 - 2024. All rights reserved.