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()指向的數據?
在我的情況完全無法使用。它只支持讀取/寫入文件,而且這不會迴應導致內存泄漏的原因。 – 2010-11-17 06:13:41
再次看到它後,它似乎可能工作......但我不得不大量編輯一些代碼,以實現這一目標。 – 2010-11-17 13:10:29
對不起 - 無法看到你的代碼有什麼問題,這取決於ffmpeg如何管理內存。我以爲我會指出一個替代方案 - 你可以在他們的關於如何調用swscale來做RGB-> YUV轉換的例子中,還有一個直接的RGB-> YUV函數的例子 – 2010-11-17 16:18:40