我正在尝试使用 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 如何在我的原始管道中选择有效格式?