gpt4 book ai didi

c++ - ffmpeg(libavcodec)。 avcodec_encode_video 中的内存泄漏

转载 作者:行者123 更新时间:2023-11-28 08:07:40 27 4
gpt4 key购买 nike

我正在尝试借助 libavcodec 对视频进行转码。在转码大视频文件(一小时或更长时间)时,我在 avcodec_encode_video 中出现大量内存泄漏。我试过调试它,但是对于不同的视频文件,不同的功能会产生泄漏,我对此有点困惑:)。这里FFMPEG with QT memory leak是我遇到的同一个问题,但我不知道那个人是如何解决的。 QtFFmpegwrapper 似乎和我做的一样(或者我错过了一些东西)。

我的方法比较低。我在外面用 av_free 和 av_free_packet 处理了 aFrame 和 aPacket。

int
Videocut::encode(
AVStream *anOutputStream,
AVFrame *aFrame,
AVPacket *aPacket
)
{
AVCodecContext *outputCodec = anOutputStream->codec;

if (!anOutputStream ||
!aFrame ||
!aPacket)
{
return 1;
/* NOTREACHED */
}

uint8_t * buffer = (uint8_t *)malloc(
sizeof(uint8_t) * _DefaultEncodeBufferSize
);

if (NULL == buffer) {
return 2;
/* NOTREACHED */
}

int packetSize = avcodec_encode_video(
outputCodec,
buffer,
_DefaultEncodeBufferSize,
aFrame
);

if (packetSize < 0) {
free(buffer);
return 1;
/* NOTREACHED */
}

aPacket->data = buffer;
aPacket->size = packetSize;

return 0;
}

最佳答案

如果可以的话,第一步是尝试在 Linux 机器上的 Valgrind 下重现您的问题。

ffmpeg编码器和解码器通常不会动态分配内存;他们在调用之间重用缓冲区。泄漏通常会出现在框架中的某处。

请注意,av_free_packet 只会在数据包具有析构函数时释放动态分配的缓冲区!

查看libavcodec/avpacket.c中函数是如何定义的:

void av_free_packet(AVPacket *pkt)
{
if (pkt) {
if (pkt->destruct) pkt->destruct(pkt);
pkt->data = NULL; pkt->size = 0;
pkt->side_data = NULL;
pkt->side_data_elems = 0;
}
}

如果没有pkt->destruct 函数,则不会进行清理!

关于c++ - ffmpeg(libavcodec)。 avcodec_encode_video 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9930357/

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