工作要做一个类似播放器的软件,但是需要自己解码,然后可能多张图像合成再显示,所以不能直接用QT播放视频的模块,就用了QOpenGLWidget来渲染。
后面发现内存一直在涨,一直以为是自己的原因,因为解码分配的内存挺多的,折腾了快一个月了,后面发现是update频繁更新导致;
如下代码,XVideoWidget继承了QOpenGLWidget,渲染代码都删完了,另外创建了一个QLabel,因为update只会触发opengl的paintevent(不信可以自己继承QLabel,在QLabel的paintevent里面打断点),所以手动调用了QLabel->update(),然后就导致了内存一直疯长,去qt的官方社区也没有找到解决办法,折中办法就是降低刷新的频率,但是视频大家都知道,一秒钟要播放几十帧的,没办法在降低了,然后label要实时滚动文字,也需要不停刷新。
我目前没有找到更好的解决办法,不知道大家有其它办法
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//PlayWidget w;
XVideoWidget w;
w.show();
w.this_run();
return a.exec();
}
class XVideoWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
XVideoWidget(QWidget* parent = NULL) : QOpenGLWidget(parent) {}
void this_run()
{
play_timer_ = new QTimer;
play_timer_->setInterval(5);
connect(play_timer_, &QTimer::timeout, this, &XVideoWidget::handle);
resize(1920, 1079);
label_ = new QLabel(this);
label_->show();
play_timer_->start();
}
public slots:
int handle()
{
update();
label_->update();
return 0;
}
protected:
void initializeGL() {}
void paintGL() {}
void resizeGL(int width, int height) {}
private:
QTimer* play_timer_;
QLabel* label_;
};