GStreamer-管道如何将files.rc连接到qmlglsink

时间:2020-08-05 15:20:39

标签: c++ qt qml gstreamer gstreamer-1.0

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

2 个答案:

答案 0 :(得分: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
    }

答案 1 :(得分:0)

使用bin或任何GStreamers自动插件会更容易。

但是这里的主要问题是您尝试将MP4文件视为H.264流。这样无法正常工作。您需要从容器中解复用媒体流。

例如管道应该是这样的:

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