让我开始一个代码片段:

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由frame.unownedPointer我RGB24数据转换为YUV420P会是修改数据指向()?

有帮助吗?

解决方案

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top