最近在做将内存媒体流数据合成为MP4文件的实现, 功能暂时还未实现, 不过在研究中发现了一个问题, 描述下:
FFMPEG输入上下文的初始化实现如下:
AVIOContext* pb = NULL;
AVInputFormat* inputFrmt = NULL;
if (mVideoBuffer == nullptr)
{
mVideoBuffer = (uint8_t*)av_malloc(VIDEO_BUFFER_SIZE);
if (mVideoBuffer == nullptr)
{
return false;
}
}
if (mInputVideoContext == nullptr)
{
// 设置FFMPEG的读取回调函数, 通过回调方式读取内存数据
pb = avio_alloc_context(mVideoBuffer, VIDEO_BUFFER_SIZE, 0, (void *)this->mVideoQueue, ReadBytesCallback, NULL, NULL);
if (av_probe_input_buffer(pb, &inputFrmt, "", NULL, 0, 0) < 0)
{
return -1;
}
DEBUG_V("Alloc format: %s[%s].", inputFrmt->name, inputFrmt->long_name);
mInputVideoContext = avformat_alloc_context();
if (mInputVideoContext == nullptr)
{
return -1;
}
mInputVideoContext->pb = pb;
}
这块代码没有问题, 然而在使用完后我想讲申请的mVideoBuffer释放却报错了, 释放代码如下:
if (mVideoBuffer)
{
av_freep(&mVideoBuffer);
}
没问题吧? 但是不行, 会报"0xC0000374: 堆已损坏"的异常, 最后做了几次测试发现在释放avio_context_free(&mInputVideoContext->pb);时mVideoBuffer就已经被释放了, 所以也就无需再次释放该内存了.