wang-bin / QtAV

A cross-platform multimedia framework based on Qt and FFmpeg. 基于Qt和FFmpeg的跨平台高性能音视频播放框架. Recommand to use new sdk https://github.com/wang-bin/mdk-sdk
http://qtav.org
3.99k stars 1.51k forks source link

发现一个bug,VideoRendererId_OpenGLWidget类型有内存泄漏 #1327

Open qht1003077897 opened 4 years ago

qht1003077897 commented 4 years ago

QtAV 1.13.0, Qt version 5.12 and win10 x64

发现一个bug:VideoRendererId_OpenGLWidget类型循环播放多个(4个)1080P视频时,会有内存泄漏

1、当窗口隐藏时候没有内存泄漏,窗口显示的时候存在内存泄漏 2、当render对象的父类qwidget有父亲qwidget时,析构父亲qwidget的时候存在内存泄漏 3、当render对象的父类qwidget没有父亲qwidget时,析构父亲qwidget的时候不会存在内存泄漏 4、VideoRendererId_Direct2D 类型不存在上述问题

qht1003077897 commented 4 years ago

我说的意思是一次性播放4个视频,实例化4个player对象。为了解决这个问题我使用了一种方法,是将render对象的父widget缓存起来,建立了一个qwidget缓存池。

qht1003077897 commented 4 years ago

@wang-bin 我发现了内存泄漏的地方:初始化绑定了纹理之后,但是没有delete。 image

首先aboutToBeDestroyed触发了resetgl(0,然后在resetgl里面去delete纹理,但是因为没有调用makecurrent()导致下面的代码被return: image 因此就没有执行下面的glDeleteTextures

期待修复,谢谢

wang-bin commented 4 years ago

你可以参考下这个方法 https://github.com/wang-bin/mdk-examples/blob/master/Qt/QMDKWidget.cpp#L103

qht1003077897 commented 4 years ago

MDK现在稳定不 😏

wang-bin commented 4 years ago

还是挺稳的,有老外在商用了

qht1003077897 commented 4 years ago

👍好的,但是我现在有个需求是需要自定义顶点数据来实现渲染画面的分割效果,mdk能支持吗? 还有mdk是不是没有开源?

wang-bin commented 4 years ago

最近会支持。没开源

qht1003077897 commented 4 years ago

那如果我要商用是要申请许可吗? 怎么操作呢?

wang-bin commented 4 years ago

对。告诉我主程序可执行文件信息我会生成个密钥。qtav贡献者、捐赠者等免费,readme最后写着

qht1003077897 commented 4 years ago

你可以参考下这个方法 https://github.com/wang-bin/mdk-examples/blob/master/Qt/QMDKWidget.cpp#L103

👍我用这个方法OK了,没有了内存泄漏。

还有我算半个贡献者吗 😏 我后面估计也要商用 windows、linux、android

wang-bin commented 4 years ago

你把你这个bug的修复让我合并就算了:)

qht1003077897 commented 4 years ago

哈哈哈,我还发现个问题,play方法中打开解码器和stop方法wait停止线程的时候都会阻塞UI,打开解码器大概在150ms左右,stop方法不一定,最长见过阻塞400ms左右,这对需要循环播放的需求来说还是个比较严重的问题

qht1003077897 commented 4 years ago

1325 这个

qht1003077897 commented 4 years ago

我测试了一下,最好像下面这样:加上Qt::DirectConnection属性

    QObject::connect(ctx, &QOpenGLContext::aboutToBeDestroyed, this,[this,ctx] {
            qDebug("QHT aboutToBeDestroyed resetGL begin");
            QOffscreenSurface s;
            s.create();
            ctx->makeCurrent(&s);
            d_func().resetGL();
            resetGL();// it's better to cleanup gl renderer resources
            ctx->doneCurrent();
            qDebug("QHT aboutToBeDestroyed resetGL end");
        }, Qt::DirectConnection);

实测某些情况下执行resetGL会崩溃

qht1003077897 commented 4 years ago

最近会支持。没开源

@wang-bin 大佬我想问下这个功能大概啥时候能支持呢? 如果可以的话我准备迁移mdk了,我们后面想商用

wang-bin commented 4 years ago

最快下周

qht1003077897 commented 4 years ago

好的,QTAV我先用着,目前能满足我们的需求,avcodec_open2函数子线程泄漏是视频解码器初始化才会泄漏,而主要的卡顿又是因为avcodec_open2音频解码器引起的,因此我把初始化音频解码器部分放到子线程中,这样可以减轻4/5的卡顿现象。