2010-11-17 123 views
0

让我开始一个代码片段: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()指向的数据?

回答

0

看看为QtFFmpegwrapper它使用保存上下文efficently做到这一点的代码,或者你可以使用QtFFMpegwrapper直接

+0

在我的情况完全无法使用。它只支持读取/写入文件,而且这不会回应导致内存泄漏的原因。 – 2010-11-17 06:13:41

+0

再次看到它后,它似乎可能工作......但我不得不大量编辑一些代码,以实现这一目标。 – 2010-11-17 13:10:29

+0

对不起 - 无法看到你的代码有什么问题,这取决于ffmpeg如何管理内存。我以为我会指出一个替代方案 - 你可以在他们的关于如何调用swscale来做RGB-> YUV转换的例子中,还有一个直接的RGB-> YUV函数的例子 – 2010-11-17 16:18:40