FFMPEG与QT内存泄漏

时间:2010-11-17 04:24:16

标签: c++ memory-leaks qt4 ffmpeg libavcodec

让我先从代码片段开始:

QByteArray ba;
ba.resize(500000);

int encsize = avcodec_encode_video(context, (uint8_t*)ba.data(), 500000, frame.unownedPointer());

我正在做的是从帧中编码数据并将数据放入指向QByteArray的缓冲区。如果我注释掉avcodec_encode_video行,我的内存泄漏就会消失。 unownedPointer()看起来像这样:

 if (this->frame != NULL) return this->frame;
    this->frame =  avcodec_alloc_frame();
    uchar *data = this->img.bits();
    frame->data[0] = (uint8_t *)data;
    frame->data[1] = (uint8_t *)data + 1;
    frame->data[2] = (uint8_t *)data + 2;
    frame->linesize[0] = width * lineSize(this->fmt);
    frame->linesize[1] = width * lineSize(this->fmt);
    frame->linesize[2] = width * lineSize(this->fmt);
    return this->frame;

此this->帧是AVFrame *,而this-> img是QImage。

在大约30fps的编码速率下,我的内存泄漏大约为50MB /秒。所以我不确定问题是什么。似乎avcodec_encode_video()正在复制内存并且永远不会释放它或其他东西。有什么想法吗?

如果avcodec_encode_video正在将我的RGB24数据转换为YUV420P,它是否会修改frame.unownedPointer()指向的数据?

1 个答案:

答案 0 :(得分:0)

看一下QtFFmpegwrapper的代码,它使用保存的上下文来有效地执行此操作,或者您可以直接使用QtFFMpegwrapper