c++ GStreamer -管道如何连接filesrc到qmlglsink

dfuffjeb  于 2023-08-09  发布在  其他
关注(0)|答案(3)|浏览(242)

我是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_h264I420。颜色调整后,将其向前调整为qmlglsink,以在qml中显示。
我错过了一些东西,我不知道如何配对GstElemnts,因为我说过我需要配对filesrc(任何视频格式)和qmlglsink

zy1mlcev

zy1mlcev1#

你可以像下面这样试试

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
    }

字符串

ubbxdtey

ubbxdtey2#

如果您还没有,则需要将状态设置为playingwithgst_element_set_state(m_video_pipeline, GST_STATE_PAUSED);

nlejzf6q

nlejzf6q3#

使用bin或任何GStreamers自动插件都更容易。
但这里的主要问题是您尝试将MP4文件视为H.264流。这样不行您需要从容器中解复用媒体流。
例如,管道应该是这样的:

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

字符串

相关问题