软件渲染并不是唯一可能的性能杀手。
我也曾经使用 QWidget 来完成类似的工作,看起来还不错。
我假设 FFmpeg 处理的结果是具有 YUV 或 RGB 配色方案的未压缩字节数组。
QPixmap::fromImage(...),这意味着复制。所以我们每一帧都有一两个完整的副本。
尝试使用现有内存缓冲区的 QImage 构造函数之一(请参阅Qt 文档)。或者,理想情况下,您应该有一个一次性分配的 QImage 并将其内存缓冲区与 FFmpeg 一起使用(FFmpeg 直接写入 QImage)
子类 QWidget,paintEvent()在那里重新实现并绘制您的 QImage(不是 QPixmap)。理想情况下,它应该与上一步中的 QImage 相同。
ffmpeg
{
mutex.lock();
write(image);
mutex.unlock();
}
QWidet::paintEvent
{
mutex.lock();
paint(image);
mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)
您绝对可以使用 QOpenGLWidget 进行 GPU 绘图,但在我看来,这对您没有多大帮助。
QOpenGLWidget使用缓冲渲染(即复制),并且需要一些周期才能将您的图像从CPU端上传到GPU端。不过,转换操作将会变得更快。