FFMPEG关于avio_alloc_context申请使用内存释放问题

最近在做将内存媒体流数据合成为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就已经被释放了, 所以也就无需再次释放该内存了.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值