使用 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
我检查了在 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