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

ffmpeg结构体(3)之AVIOContext及其相关函数 这个结构体,是FFmpeg中有关io操作的顶层结构体,是avio的核心。FFmpeg支持打开本地文件路径和流媒体协议的URL。 虽然AVIOContext时avio操作的核心,但AVIOContext中的所有函数指针都不应该直接调用,它们只应在实现自定义I / O时由客户端应用程序设置。 通常这些设置为avio_alloc_context()中指定的函数指针(下一节中的read_packet函数指针)。 AVIOContext的相关调用都是在AVFormatContext... 阅读详情

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

FFmpeg API 之 libavformat库 libavformat库,是FFmpeg中用于处理各种媒体容器格式(media container format)的库。它的两个最主要的功能是 : demuxing:解封装,将一个媒体文件分割为多个多媒体流 muxing:封装,将多个多媒体数据流写入到指定媒体容器格式的文件中 这两个过程所做的事情正好相反,是互逆的。 我们注意到,在 mux 和 demux 的过程中,均少不了要从 input 读取 和 写入 output 的过程,因此 libavformat 单独分出了一个子模块,用于 阅读详情

相关推荐

最简单的基于FFmpeg的内存读写的例子:内存播放器

最简单的基于打算记录两个最简单的FFmpeg进行内存读写的例子。之前的所有有关FFmpeg的例子都是对文件进行操作的。例如《100行代码实现最简单的基于FFMPEG+SDL的视频播放器》播放的是一个视频的文件。而《最简单的基于FFMPEG的转码程序》也是将一个视频文件转换为另一个视频文件。《最简单的基于FFmpeg的视频编码器(YUV编码为H.264)》也是最后编码得到一个H.264视频文件。实际上,并不是所有视频的编码,解码都是针对文件进行处理的。有的时候需要的解码的视频数据在一段内存中。

yinshipin007的博客 853

avio_alloc_context

avio_alloc_context:从内存中进行读取或者输出到内存。 源码如下: int ffio_init_context(AVIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int (*read_..

qq_34062754的博客 3488

音视频开发22 FFmpeg AVIO内存输入模式

avio是FFmpeg中的一个模块,用于实现多种输入输出方式的封装。avio提供了一系列API,可以将数据从内存读取到缓冲区中,也可以将缓冲区中的数据写入到内存中。其实现依赖于IOContext结构体,该结构体定义了当前输入/输出事件的状态、数据、回调函数等信息,并支持通过自定义回调函数实现不同的输入/输出方式。内存输入(Memory Input)是指将数据从内存中读取到缓冲区中,常见的应用场景包括:从内存中读取音视频数据进行解码或处理。

hunandede的博客 1318

FFmepg --04-内存模型:avio_alloc_context分配上下文

内存模型:avio_alloc_context分配上下文

qq_43538607的博客 1436

如何用FFmpeg将输出的TS流写到内存

     最近需要实现一个功能:利用FFmpeg将编码出来的视频流和音频流混合封装成TS格式,然后通过自定义协议将TS流发送出去。因为发送协议是自己定义的,FFmpeg不支持这种网络协议,不能用它内置的协议。后来发现原来FFmpeg也支持将输出的流回调到给上层去处理,下面简单讲一下实现的流程。     首先,我们按照把流输出到文件的方式来处理,但是有小小的不同,下面是初始化输出流的代码: A...

爱写代码的自由人 6447

ffmpeg 如何探测网络流格式/如何从内存中获取数据

一般ffmpeg都是直接从文件中读取或者从网络流中读取,比如rtp://xx.xx.xx.xx:xxxx。 事实上也支持从内存中获取。 函数avio_alloc_context()实现该功能。AVIOContext *avio_alloc_context( unsigned char *buffer, int buffer

BIGBurning 1万+

【三分钟学习FFMPEG一个知识点】FFMPEG关于avio_alloc_context申请使用内存释放问题

问题: 使用ffmpeg发现av_malloc申请的内存最后不能用av_free函数释放,会崩溃。 代码示例: unsigned char * iobuffer = NULL; iobuffer = (unsigned char *)av_malloc(40000); if (iobuffer == NULL) { printf("iobuffer av_malloc failed.\n"); return -1; } AVI

谁吃薄荷糖 1万+

如何用FFmpeg读取内存的PS/TS流,分离出视频和音频

之前做一个项目遇到一个问题:从网络中收到PS/TS流,需要从中分离出视频和音频,但是FFmpeg只支持标准的几种输入流协议(RTP/HTTP/RTSP/MMS),而我们的协议它不支持,所以就不能够用它来直接做接收。那能否由自己来接收数据然后让FFmpeg读取内存中的数据呢?答案当然是可以的,这就需要用到FFmpeg的探测流格式的功能,主要是用到了两个API: avio_alloc_cont...

爱写代码的自由人 6466

【FFmpeg】关键结构体的初始化和释放(AVFormatContext、AVIOContext等)

在记录了一些主要函数的执行流程之后,可以看看几个关键结构体的初始化函数和释放函数,这样对整个FFmpeg更加熟悉一些。需要说明的是,在FFmpeg当中,很多函数都能够实现关键结构体的初始化,举例来说,对于AVFormatContext,可以使用avformat_alloc_output_context2初始化,这个函数会根据输出的format来初始化AVFormatContext,这样的操作避免了先进行malloc,然后手动赋值的流程。不过本文记录的函数是最基本的函数,尽量避免与其他结构体交织在一起

weixin_42877471的博客 1900

从玩具到工业:手把手教你用Webots仿真Scara抓取(逆解实战篇)

本文详细介绍了如何在Webots仿真环境中实现Scara机械臂的逆解计算与抓取操作,涵盖从环境配置、逆运动学算法到轨迹规划与实时控制的完整流程。通过实战案例演示,帮助读者掌握机械臂逆解的核心技术,并应用于工业自动化场景,提升Scara机械臂的编程与控制能力。

weixin_30932215的博客 504

树莓派5安装ROS2小白指南避坑攻略

手把手教你如何在树莓派5上顺利安装ROS2,避开常见问题与陷阱,提升配置效率。针对树莓派5安装ros2过程中的依赖冲突、源配置错误等高频难题提供解决方案,适合新手快速上手。

weixin_35754962的博客 1004

ffmpeg中avio_alloc_context设置

/** * Allocate and initialize an AVIOContext for buffered I/O. It must be later * freed with av_free(). * * @param buffer Memory block for input/output operations via AVIOContext. * The bu

楠倏的博客 7374

华为防火墙双ISP出口实战:如何用策略路由实现电信联通流量自动切换(附配置截图)

本文详细解析了华为防火墙在双ISP环境下的智能选路技术,通过策略路由与健康检测的深度应用,实现电信联通流量的自动切换。文章包含实战配置截图,帮助企业解决切换延迟、路径劣化等核心挑战,提升业务连续性。

backprop5master的博客 643

ffmpeg学习日记22-内存读取avio_alloc_context函数的内存释放问题

ffmpeg学习日记22-内存读取avio_alloc_context函数的内存释放问题 在开发内存读写数据过程中,遇到了内存泄露的问题,泄漏点围绕着avio_alloc_context函数,在内存中读写数据参考雷神文章ffmpeg 从内存中读取数据(或将数据输出到内存),在雷神的文章中,只讲述了如何实现内存读写的功能,没有讲到内存释放,或许这根本就不是问题。 // Input if (!(ifmt_ctx_v = avformat_alloc_context())) { s

WenCoo的博客 2263

Topas——基于Geant4的放射治疗蒙特卡罗算法模拟工具

本文内容参考Joseph Perl 的线上会议,视频详情可见于,该视频会议内容主要介绍Topas功能、软件架构、工作流程、参数设定、物理模型、具体案例等,对TOPAS的基本入门使用方法以及使用规定作出阐述。

fy方的博客 7603

项目管理知识体系(PMBOK)中的质量规划详解

你是否遇到过这些场景?软件上线后用户投诉“功能漏洞多”,团队连夜返工;装修完的房子墙面开裂,施工方和业主互相推诿;新研发的手机电池续航不达标,被迫延迟发布。这些问题的根源,往往是项目启动时没有做好质量规划。本文聚焦PMBOK中“质量规划”(Plan Quality Management)过程,覆盖其核心概念、操作步骤、工具技术与实战应用,适用于IT、建筑、制造等各类项目场景。

项目管理的博客 1118

ffmpeg 中avio_alloc_context的使用

使用

u013506600的专栏 1万+

6、业务影响分析(BIA)的数据收集与关键指标评估

本文全面解析了业务影响分析(BIA)的核心内容,包括数据收集、业务流程分析、信息系统与资产清单、人员与供应商依赖、影响声明、关键指标评估(如MTD、RTO、RPO)、威胁建模与风险分析等。通过详细的介绍和图表展示,帮助组织系统性地制定灾难恢复计划,以应对各种潜在风险,确保关键业务流程在灾难发生后能够快速恢复并持续运营。

moss5的博客 374

ffmpeg之avio_alloc_context函数解读笔记

一、avio_read函数调用栈 av_read_frame ->read_frame_internal ->ff_read_packet ->s->iformat->read_packet(以ff_yuv4mpegpipe_demuxer为例) ->av_get_packet ->append_packet_chunked ->avio_read ffmpeg这么做的好处是,在 ...

CrystalShaw的博客 5190

RK3588开发板NPU加速YOLO目标检测完整实战教程

🚀 RK3588开发板NPU加速YOLO目标检测实战 本文详细介绍了如何在瑞芯微RK3588开发板上利用内置NPU加速YOLO目标检测的全流程: 1️⃣ 环境准备:配置RKNPU2 SDK和aarch64交叉编译器,搭建Ubuntu开发环境 2️⃣ 模型转换:从ONNX格式转换为专用RKNN模型,适配NPU硬件特性 3️⃣ 性能对比:NPU推理将处理时间从833ms降至50ms以下,帧率提升16倍 4️⃣ 实战应用:支持图像/视频流/摄像头实时检测,提供完整编译和运行命令 关键优势:专为边缘AI设计的6T

FJN110的博客 931

基于高频变压器的隔离式推挽栅极驱动电路

摘要:本文介绍了一种基于高频变压器的隔离式推挽栅极驱动电路,通过变压器实现电气隔离,为功率MOS管提供可靠驱动信号。电路包含输入侧PWM信号处理、变压器磁耦合隔离传输以及副边驱动逻辑等关键部分,利用电阻电容网络控制开关速度并防止误触发。该隔离驱动方案广泛应用于高压开关电源、新能源汽车电机控制器、光伏逆变器和工业变频器等需要高电压隔离及抗干扰能力的电力电子设备中,有效保障系统安全性和可靠性。

qq_37999850的博客 481

FFmpeg内存IO模式

ffmpeg 支持从网络流 或者本地文件读取数据,然后拿去丢给解码器解码,但是有一种特殊情况,就是数据不是从网络来的,也不再本地文件里面,而是在某块内存里面的。这时候 av_read_frame() 函数怎样才能从内存把 AVPacket 读出来呢?

u012117034的博客 1719

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

FFmpeg——avio_reading实例(学习)

avio_reading是关于对音视频流内存读取操作的应用实例,将文件中获取的数据流映射到内存再进行读取解析。(刚开始学习这块,主要作为学习记录,可能会存在很多问题)

qq_15672897的博客 1115

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

封装API:avformat_alloc_output_context2,avformat_free_context,avformat_new_stream,avio_open,avio_close

***/

hunandede的博客 1089

FFmpeg --15-视频解码: AVIO内存输入模式分析

AVIO内存输入模式分析

qq_43538607的博客 899

FFmpeg源代码简单分析:avformat_alloc_output_context2()

本文简单分析FFmpeg中常用的一个函数:avformat_alloc_output_context2()。在基于FFmpeg的视音频编码器程序中,该函数通常是第一个调用的函数(除了组件注册函数av_register_all())。avformat_alloc_output_context2()函数可以初始化一个用于输出的AVFormatContext结构体。它的声明位于libavformat\a

雷霄骅(leixiaohua1020)的专栏 5万+
上一篇: Car-eye 平台的去中心化云架构初步方案
下一篇: 使用FFMPEG库将内存中的H264跟AAC数据流合成MP4文件
路过&
博客等级 码龄19年 126粉丝 91原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值