ffmpeg的IO操作主要在libavformat库中实现,部分实现用到了libavutl中的工具。网上有一些介绍ffmpeg的IO的文章,但是有些比较老了,并且一些现在ffmpeg结构已经一些变化,比如ByteIOContext已经改名为AVIOContext,本文章主要介绍IO基础,以及一些ffmpeg对于一些内存操作的方法。
所谓IO就是数据的存取,主要的途径也就是文件或者网络。数据IO是基于文件格式的,与具体的编码标准无关。
ffmpeg对各种协议实现了封装,使用同样的接口,完成对不同数据的读取。比较屌。
ffmpeg所有的协议的注册是在av_register_all中完成的。协议保存在链表first_protocol中。
ffmpeg的IO层次,不同的封装层次:
URLContext层次的操作主要有:url_open,url_read,url_write,url_seek,url_close等
AVIOContext层次的操作主要有:avio_open,avio_clse,avio_rxxx,avio_wxxx。事实上这是对URLContext层次的上层操作。或者更高层次的抽象封装。
avio_rxxx和avio_wxxx简介的调用ffurl_read,ffurl_write,实现读写操作,而avio_open根据文件名来实现avio_rxxx和avio_wxxx和不用媒介的操作函数ffurl_read,ffurl_write的绑定。
avio_rxxx和avio_wxxx实现的是对内存缓冲区中数据的操作,当缓冲区中数据不足或者缓冲区将要溢出时,调用flush_buffer和fill_buffer将数据把数据读到媒介中。