一、不太推荐使用 QPainter 绘制视频
在 Qidget 上显示视频,一般是通过 paintEvent,由于 QPainter 不是用来渲染视频的,是用来自绘 GUI 的,用的是 CPU 渲染,而不是 GPU,缺乏显卡加速,性能达不到绘制视频的要求。另外,视频绘制也不应该使用事件驱动,使用事件驱动会让绘制操作运行在主线程里,这有可能阻塞 UI 事件响应,显然是不合理的。另外还有以下缺陷:
- YUV 转 RGB 转换需要消耗大量 CPU;
- QPainter 大面积绘制效率不高,测试过,如果只是些小预览窗口绘图还行,如果是大的窗口,越大越消耗 CPU,至于全屏则是会卡到爆。
二、推荐使用 QOpenGLWidget 绘制视频
现在一般性能好点的嵌入式板子都有 GPU,支持 OpenGL的话,最推荐使用 Qt 官方自带的 QOpenGLWidget 来绘图。
具体就是显示视频的那个类, 让它继承 QOpenGLWidget,这样使用的是 GPU 渲染,然后重新使用 paintEvent 函数,就不怎么消耗 CPU 了。
三、CPU 绘图推荐使用 SDL、OpenCV 等第三方库
拿到 widget 的窗口句柄(好像是 winid() 这个函数的返回值)或者窗口位置,配合其他工具(opengl、directx 等,在 linux 中我推荐试试 SDL,接口比较友好)自行绘制。如果是嵌入式板子,需要交叉编译 SDL 等库。
本文福利,莬