2010-11-17 75 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