音视频解码 AVIO内存输入模式

原因

根据下文,我们已经学会了如何从本地文件读取数据,对音视频进行解码操作得到原始数据。

ffmpeg 音视频解码-CSDN博客

现在有一个需求,网络读取到的数据,也就是内存数据如何直接进行解码操作?

本文就是介绍解决这个问题。

AVIO内存输入模式

AVIO内存输入模式是FFmpeg库中用于处理多媒体数据的一种方式,它允许数据直接从内存中读取或写入,而不是通过文件系统。这种模式的特点主要包括:

  1. 灵活性:AVIO内存输入模式提供了一种机制,可以直接从内存读取数据,适用于数据已经加载到内存中,或者需要从非文件源(如网络流)读取数据的情况 。

  2. 性能:由于数据直接在内存中处理,避免了磁盘I/O操作,这可以减少延迟,提高处理速度 。

  3. 自定义IO操作 :用户可以自定义AVIO的输入和输出函数,实现特定的数据处理逻辑,例如裁剪、缩放或添加水印等操作,而无需先将数据写入磁盘 。

  4. 内存管理 :使用AVIOContext结构体进行内存管理,其中包括了读写缓存、读写函数指针、读写偏移量等信息,支持自定义协议和数据源 。

  5. 高效数据处理:AVIO内存输入模式支持从内存流中读取媒体数据,解码器可以直接对这些数据进行解码,然后由播放器呈现,这提供了无缝的媒体播放体验 。

  6. 节约资源:由于避免了磁盘操作,这种模式可以减少对磁盘空间的占用,节省存储资源 。

  7. 应用广泛:适用于多种多媒体应用,包括在线视频播放、本地视频播放和媒体处理等场景 。

  8. 回调机制 :通过回调函数read_packetwrite_packet实现自定义的读写逻辑,这些回调函数会在需要从输入源读取或向输出源写入数据时被调用 。

  9. 结构体管理AVIOContext结构体用于管理输入/输出缓冲区,通过avio_alloc_context()函数分配并初始化,支持设置自定义的读写和定位操作回调函数 。

  10. API支持 :FFmpeg提供了丰富的API支持,包括av_malloc()avio_alloc_context()avcodec_find_decoder()av_read_frame()等,以实现内存输入和输出的高效管理 。

综上所述,AVIO内存输入模式以其高效、灵活和可定制的特点,在多媒体数据处理中发挥着重要作用。

主要使用流程和api介绍

下列主要介绍使用avio内存输入模式,进行初始化,数据来源绑定以及读取数据。

cpp 复制代码
//1.自定义io  稍后必须用av_free()释放
io_buf=(uint8_t*)av_malloc(IO_BUFFER_SIZE);

/**2.定义io上下文
* 分配并初始化一个AVIOContext对象,用于缓冲式I/O操作。
之后必须使用avio_context_free()函数释放该对象。

* @param buffer 用于通过AVIOContext进行输入/输出操作的内存块。
* @param buffer_size 缓冲区的大小对于性能非常重要。
* 对于具有固定块大小的协议,应将其设置为该块大小。
* 对于其他协议,典型的大小是一个缓存页,例如4KB。

* @param write_flag 设置为1表示缓冲区可写,否则设置为0。
* @param opaque 是 read_packet / write_packet 的第⼀个参数,指向⽤户数据。
* @param read_packet 用于重新填充缓冲区的函数,可以为NULL。
* 对于流协议,必须永远返回非0值,而不是适当的AVERROR代码。
* @param write_packet 用于写入缓冲区内容的函数,可以为NULL。
* 该函数不得更改输入缓冲区的内容。
* @param seek 用于跳转到指定字节位置的函数,可以为NULL。
* return  分配的 AVIOContext 对象,或者在失败时返回 NULL。
*/
avio_ctx = avio_alloc_context(io_buf,IO_BUFFER_SIZE
                                                   ,0,(void*)infd
                                                   ,read_packet
                                                   ,nullptr,nullptr);
//3 创建视频信息对象。
AVFormatContext 主要是数据存储 封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式相关信息。
fmt_ctx = avformat_alloc_context();
fmt_ctx->pb=avio_ctx; // 绑定I/O 上下文

//4.打开io
ret = avformat_open_input(&fmt_ctx,NULL,NULL,NULL);//打开输入视频文件


//5. 数据来源avio 读取一帧数据 存储到pkt 然后进行解码操作
ret = av_read_frame(fmt_ctx,pkt);
decode(codec_ctx,pkt,frame,outfd);

总结

ffmpeg提供了avio内存输入模式,让我们在对音视频处理时更得心应手。可以对内存中的数据直接操作,而不是读取io文件。

相关推荐
MediaTea6 小时前
Pr 视频过渡:沉浸式视频 - VR 色度泄漏
音视频·vr
LNTON羚通7 小时前
算法定制LiteAIServer摄像机实时接入分析平台烟火检测算法的主要功能
音视频·视频监控
EasyCVR12 小时前
EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
人工智能·算法·ffmpeg·音视频·webrtc·监控视频接入
冷凝女子14 小时前
【QT】海康视频及openCv抓拍正脸接口
qt·opencv·音视频·海康
安步当歌15 小时前
【WebRTC】视频编码链路中各个类的简单分析——VideoStreamEncoder
音视频·webrtc·视频编解码·video-codec
顾北川_野15 小时前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
顶呱呱程序15 小时前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
EasyCVR17 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
runing_an_min17 小时前
ffmpeg 视频滤镜:屏蔽边框杂色- fillborders
ffmpeg·音视频·fillborders
我喜欢就喜欢1 天前
基于qt vs下的视频播放
开发语言·qt·音视频