使用 qt gstreamer 获取视频帧

get a video frame using qt gstreamer

我检查了在 qml video surface 中显示良好的视频流。现在我想获取视频帧数据来做一些不错的事情。但是,直到现在它似乎还不太好......我做了一个像下面这样的简单管道来专注于测试。

nvarguscamerasrc - appsink

我使用 QGst::Utils::ApplicationSink 来获取帧数据。我引用了一个例子“appsink-src

/* making pipeline */
QGst::ElementPtr source, sink;
SubClassApplicationSink *appsink;

source = QGst::ElementFactory::make("nvarguscamerasrc");
sink = QGst::ElementFactory::make("appsink");
appsink = new SubClassApplicationSink();

// configure elements    
source->setProperty("sensor-id", n);
appsink->setElement(sink);
appsink->enableDrop(true);
appsink->setMaxBuffers(7654321);

m_pipeline->add(source, sink);
source->link(sink);

ApplicationSink 的子类实现了一些回调 eos、preroll、sample。

然后我在从新样本中获得的缓冲区中打印日志一些值。

调用回调函数时重复相同的输出。

结果:[start-end offsets are -1, no flags, memory count 1, memory size 1008]

不知道为什么……你觉得怎么样?

我解决了这个问题。问题是管道的组成。在“nvarguscamerasrc”和“appsink”之间放置一个“nvvidconv”元素后,我就可以成功获取视频帧了。

我不知道为什么需要 nvvidconv 元素。但是,似乎是因为源的视频类型,“video/x-raw(memory:NVMM)”,这意味着出于性能原因使用 DMA 缓冲区。

https://forums.developer.nvidia.com/t/what-is-the-meaning-of-memory-nvmm/180522