一、效果
二、实现原理
如果使用Qt的Label->setPixmap()来绘制图像,会导致CPU占用太高,解决办法是自定义控件,控件继承QWidget并重载paintEvent,然后调用painter.drawPixmap函数实现绘制一帧视频或图像。
注意:
- 不要继承QLabel并直接调用成员函数setPixmap来实现视频帧显示。这个方法会造成软件界面卡顿。且cpu使用率到60%。且兼有内存泄漏的问题。
- 不要继承QOpenGLWidget并重载paintEvent然后使用painter.drawPixmap来显示视频。此方法在Mac平台下测试发现。在缩放窗口的时候会造成视频有残影。
三、按视频原始比例显示视频的计算方法
四、使用方法与使用效果
本控件是一个基于QWidget的类,按照一个使用QWidget来添加到布局即可。
显示视频帧的对外公共函数如下:
void SetVideoPixmap(QPixmap &pixmap);
把视频帧转换为pixmap后,调用此函数显示即可。注意把视频解码之类的计算在非ui线程计算,即这个控件只做显示的部分。因此避免卡死ui现场造成软件界面“无响应”的现象。
实际在mac平台下测试,每秒播放24帧图像,图像原始尺寸100*100,cpu使用率9%
五、源码
因为源码很少,直接附到下面:
myvideowidget.h
#ifndef MYVIDEOWIDGET_H
#define MYVIDEOWIDGET_H
#include <QLabel>
#include <QRect>
#include <QPixmap>
#include <QResizeEvent>
#include <QWidget>
#include <QOpenGLWidget>
class MyVideoWidget : public QWidget //QOpenGLWidget //QLabel
{
Q_OBJECT
public:
explicit MyVideoWidget(QWidget *parent);
~MyVideoWidget() override;
MyVideoWidget();
void