让我从一个代码片段开始:
QByteArray ba;
ba.resize(500000);
int encsize = avcodec_encode_video(context, (uint8_t*)ba.data(), 500000, frame.unownedPointer());
我要做的是对帧中的数据进行编码,并将数据放入指向qbytearray的缓冲区中。如果我对avcodec编码视频线发表评论,我的内存泄漏就会消失。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()指向的数据吗?