【发布时间】:2014-12-04 15:24:15
【问题描述】:
任务是从 QVideoFrame 中复制一个帧,并可能对该图像执行一些操作并在 QML 中显示处理后的图像。
...
m_lastFrame = QImage(videoFrame.width(), videoFrame.height(), QImage::Format_ARGB32);
memcpy(m_lastFrame.bits(), videoFrame.bits(),videoFrame.mappedBytes());
...
上面的代码会导致崩溃,因为 m_lastFrame 缺少 32 个字节(3686400 vs 3686432) videoFrame.mappedBytes() 报告 3686432 字节。我在这里做错了什么?或者我应该如何计算 m_lastFrame() 的大小。
代码在 Mac OSx 10.9.5 Qt 5.1.1 上运行。
一些附加代码:
... if( videoFrame.map(QAbstractVideoBuffer::ReadOnly) ){
m_lastFrame = QImage(videoFrame.width(),videoFrame.height(),QImage::Format_ARGB32);
memcpy(m_lastFrame.bits(), videoFrame.bits(),videoFrame.mappedBytes() - 32);
...
} ...
【问题讨论】:
-
你有没有给
videoFrame.map(QAbstractVideoBuffer::ReadOnly)打过电话并检查过返回值?您确定视频帧包含 ARGB32 数据吗? -
在调用
videoFrame.bits()之前,您是否成功地将视频帧的内容映射(通过调用map())到系统内存?在那种情况下,我认为您的问题应该通过从像素格式正确转换为图像格式来解决。 -
是的@njahnke。我是按照上面的
调用map() -
好的,@mhcuervo。谢谢你们的帮助,我检查了格式,它使用了正确的格式。我将在电脑上运行这段代码,看看结果如何。
-
在带有 Qt 5.3.2 的 Windows 8 上测试。两个函数都返回 3686400bytes。因此,似乎是MAC上的问题。但是,在 PC 上发现了其他问题,返回的帧是颠倒的,RGB32 图像只是呈现一个白色帧。转换为 ARGB_32 并渲染图像。下一步将采取一些日志来调查实际像素值。这个想法是在多个平台上使用它,到目前为止,Qt fw 似乎没有提供良好的跨平台功能。
标签: qt