QtGStreamer在来自摄影机的流媒体上未产生预期输出

QtGStreamer在来自摄影机的流媒体上未产生预期输出,gstreamer,qtgstreamer,Gstreamer,Qtgstreamer,我正在尝试使用QtGStreamer来流式传输摄影机帧,并将其渲染到QML窗口。我有一个简单的Gstreamer管道,当我使用gst-launch-1.0 gst-launch-1.0 autovideosrc ! videoscale ! video/x-raw, width=480,height=270 ! xvimagesink -e 现在,我创建一个对应的QtGStreamer管道,如下所示: void Streamer::startStreaming() { if (!m_s

我正在尝试使用QtGStreamer来流式传输摄影机帧,并将其渲染到QML窗口。我有一个简单的Gstreamer管道,当我使用
gst-launch-1.0

gst-launch-1.0 autovideosrc ! videoscale ! video/x-raw, width=480,height=270 ! xvimagesink -e
现在,我创建一个对应的QtGStreamer管道,如下所示:

void Streamer::startStreaming()
{
    if (!m_streaming_pipeline) {
        m_streaming_pipeline = QGst::Pipeline::create();
        if (m_streaming_pipeline) {
            QGst::ElementPtr source = QGst::ElementFactory::make("autovideosrc");
            QGst::ElementPtr scale = QGst::ElementFactory::make("videoscale");
            scale->setProperty("caps", QGst::Caps::fromString("video/x-raw, width=480,height=270"));
            if (m_videoSink) {
                m_videoSink->setProperty("sync", false);
                m_streaming_pipeline->add(source, scale, m_videoSink);
                source->link(scale);
                scale->link(m_videoSink);
                QGst::BusPtr bus = m_streaming_pipeline->bus();
                bus->addSignalWatch();
                QGlib::connect(bus, "message", this, &Recorder::onBusMessage);
                m_streaming_pipeline->setState(QGst::StatePlaying);
                qDebug() << "Done";
            }
        }
    }
}
我注意到的另一件事是,帧确实被渲染,这几乎是颜色方案被翻转。因此,这条线路上的某些东西似乎也在翻转颜色通道

编辑

我发现我需要添加一个capsfilter来获得正确的格式。因此,添加如下内容:

QGst::ElementPtr capsfilter = QGst::ElementFactory::make("capsfilter", "capsfilter");
capsfilter->setProperty("caps", QGst::Caps::fromString("video/x-raw, width=1920, height=1080, format=RGB, framerate=30/1"));
然后通过

m_streaming_pipeline->add(source, capsfilter, scale, m_videoSink);
随后,它解决了这个问题


尽管现在我的问题是gstreamer如何在我的原始管道中选择有效的格式?

尝试
videoconvert
。它通常用于两条管道之间的自动封盖设置。太棒了!谢谢你的提示@VELCANTRY
视频转换
。它通常用于两条管道之间的自动封盖设置。太棒了!谢谢你的提示@维尔坎
m_streaming_pipeline->add(source, capsfilter, scale, m_videoSink);