gpt4 book ai didi

c++ - 带有 QT 内存泄漏的 FFMPEG

转载 作者:行者123 更新时间:2023-12-04 23:31:21 26 4
gpt4 key购买 nike

让我从一个代码片段开始:

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;

其中 this->frame 是一个 AVFrame *,而 this->img 是一个 QImage。

在大约 30fps 的编码速率下,我得到大约 50MB/秒的内存泄漏。所以我不确定问题可能是什么。似乎 avcodec_encode_video() 正在复制内存并且从不释放它或其他东西。有任何想法吗?

如果 avcodec_encode_video 将我的 RGB24 数据转换为 YUV420P,它会修改 frame.unownedPointer() 指向的数据吗?

最佳答案

查看 QtFFmpegwrapper 的代码它使用保存的上下文来有效地执行此操作,或者您可以直接使用 QtFFMpegwrapper

关于c++ - 带有 QT 内存泄漏的 FFMPEG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4201481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com