媒体的整体的处理流程大概如上,从存储/网络中读入数据,解析格式进行解封装然后进行解码,对解码后的数据进行处理,重新编码,进行封装,进行存储输出
首先从输入输出入手,ffmpeg以AVFormatContext为中心,左侧是举了一个输出的类图格式,输入也类似,如下:
AVFormatContext中打开文件的时候首先会根据打开的文件名字以及文件内容进行封装格式猜测,根据不同文件的类型生成AVOutputFormat,其中实现了写的函数,写的时候会根据不同的封装格式进行写(读数据的时候也同理);
读和写都需要最终的对象, ffmpeg通过AVIOContext来进行管理,通过打开对象的名字不同,自动识别属于http还是rtmp或者是一个文件等等,对应的它们都在ffmpeg中作为一个URLContext,对于一个文件而言,URLContext中的priv_data存储了打开的fd,而prot则是读写操作的接口。
右侧则是对媒体帧数据的属性管理,ffmpeg使用stream来进行管理, streams中存储了帧数据中的相应属性,对于视频,譬如编解码器信息,帧率,分辨率,时间戳等,对于音频,有编码器信息,采样率等等; 当从输入流读取数据之后,需要根据这些属性对输出流进行相应的的设置