2

我正在编写一个视频播放器,我的代码将视频解码为原始 YCbCr 帧。通过 Qt 框架输出这些的最快方法是什么?我想避免复制太多数据,因为图像是高清格式的。

恐怕软件颜色转换为 QImage 会很慢,并且稍后在绘制到 GUI 时会再次复制 QImage。

我看过 QAbstractVideoSurface 甚至有运行代码,但无法掌握它是如何更快的,因为就像在 VideoWidget 示例中一样(http://idlebox.net/2010/apidocs/qt-everywhere-opensource-4.7.0. zip/multimedia-videowidget.html ),渲染仍然是通过使用 QImage 调用 QPainter::drawImage 来完成的,它必须是 RGB。

在我看来,首选解决方案可以直接访问硬件表面,我可以将 YCbCr 解码到该硬件表面,或者至少直接将 RGB 转换(使用 libswscale)。但我看不出我怎么能做到这一点(虽然不使用 OpenGL,但它也可以让我自由缩放)。

4

1 回答 1

0

一种常见的解决方案是使用带有纹理映射的 QGL Widget。应用程序在第一帧分配纹理缓冲区,然后在剩余帧中调用更新纹理。这是纯 GL 调用,Qt 还不支持纹理操作。但是 QGLwidget 可以用作容器。

使用 SSE2 完成解码。希望这可以帮助。

于 2014-01-15T06:02:17.087 回答