1

我正在尝试使用 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";
            }
        }
    }
}

所以首先,这真的很慢。虽然最初的 gstreamer 命令以 30 帧/秒的速度轻松运行,但它以每秒几帧的速度运行。当我设置时,我也会在控制台上得到这个输出GST_DEBUG=3

0:00:08.661824920 23980      0x2ac6370 WARN          v4l2bufferpool gstv4l2bufferpool.c:540:gst_v4l2_buffer_pool_set_config:<autovideosrc0-actual-src-v4l:pool:src> libv4l2 converter detected, disabling CREATE_BUFS
0:00:08.665945185 23980      0x2ac6370 WARN          v4l2bufferpool gstv4l2bufferpool.c:748:gst_v4l2_buffer_pool_start:<autovideosrc0-actual-src-v4l:pool:src> Uncertain or not enough buffers, enabling copy threshold

我注意到的另一件事是渲染的帧,几乎是颜色方案被翻转了。因此,似乎沿线的某些东西也在翻转颜色通道。

编辑

我发现我需要添加一个 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 如何在我的原始管道中选择有效格式?

4

0 回答 0