我正在用一张BGR图像填充一个Frame
以进行编码,但似乎出现了内存泄漏。我认为我找到了问题的根源,但它似乎是一个库的问题而不是我的错误。由于FFmpeg是一个如此成熟的库,我想我可能在错误地使用它,我想得到指导,了解正确的使用方法。
我正在使用以下代码来分配一个Frame
:
AVFrame *bgrFrame = av_frame_alloc();
后来,我使用以下代码在Frame
中分配图像:
av_image_alloc(bgrFrame->data, bgrFrame->linesize, bgrFrame->width, bgrFrame->height, AV_PIX_FMT_BGR24, 32);
然后我使用以下方法填充分配的图像:
av_image_fill_pointers(bgrFrame->data, AV_PIX_FMT_BGR24, bgrFrame->height, originalBGRImage.data, bgrFrame->linesize);
当originalBGRImage
是一个OpenCV的Mat
时。
显然,这段代码存在内存泄漏。在av_image_alloc()
和av_image_fill_pointers()
中,会在同一指针上分配内存(通过bgrFrame->data[0]
的变化可以看出)。
如果我调用
av_freep(&bgrFrame->data[0]);
在使用
av_image_alloc()
时,一切正常,但是如果我在av_image_fill_pointers()
之后调用它,程序就会崩溃,尽管bgrFrame->data[0]
不是NULL
,这让我很好奇。查看FFmpeg的
av_image_alloc()
源码,我发现它内部调用了两次av_image_fill_pointers()
,第一次分配缓冲区buff
......而稍后在av_image_fill_pointers()
源码中,data[0]
被图像指针替换,这就是内存泄漏的来源,因为data[0]
原来持有av_image_alloc()
上一次调用的buf
。因此,最终的问题是: 如何正确地用图像填充帧?
avpicture_fill
,它不会分配内存。无论如何,您应该只分配一个帧并重复使用它。此外,请检查您是否真正需要av_freep
或av_free
。 - SpamBot