FFMPEG与QT内存泄露
问题描述:
让我开始一个代码片段:FFMPEG与QT内存泄露
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;
哪里这个 - >帧是AVFrame *,和这个 - > IMG是QImage的。
在约30fps的编码速率下,我得到约50MB /秒的内存泄漏。所以我不确定这个问题会是什么。看起来,如果avcodec_encode_video()是复制内存,并从来没有释放它或什么。有任何想法吗?
如果avcodec_encode_video正在将我的RGB24数据转换为YUV420P,它是否会修改frame.unownedPointer()指向的数据?
在我的情况完全无法使用。它只支持读取/写入文件,而且这不会回应导致内存泄漏的原因。 – 2010-11-17 06:13:41
再次看到它后,它似乎可能工作......但我不得不大量编辑一些代码,以实现这一目标。 – 2010-11-17 13:10:29
对不起 - 无法看到你的代码有什么问题,这取决于ffmpeg如何管理内存。我以为我会指出一个替代方案 - 你可以在他们的关于如何调用swscale来做RGB-> YUV转换的例子中,还有一个直接的RGB-> YUV函数的例子 – 2010-11-17 16:18:40