【问题标题】:GStreamer - Pipeline how to connect filesrc to qmlglsinkGStreamer - 管道如何将 filesrc 连接到 qmlglsink
【发布时间】: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_h264I420 .颜色后,调整前向qmlglsink显示在qml中。

我遗漏了一些东西,我不知道如何配对 GstElemnts,因为我说过我需要配对 filesrc(任何视频格式)和 qmlglsink

【问题讨论】:

    标签: c++ qt qml gstreamer gstreamer-1.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
        }
    

    【讨论】:

      【解决方案2】:

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

      但这里的主要问题是您尝试将 MP4 文件视为 H.264 流。这不能以这种方式工作。您需要从容器中解复用媒体流。

      例如管道应该是这样的:

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

      【讨论】:

      猜你喜欢
      • 2022-12-02
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多