本系列前办部分应该是对雷神和其他资料的总结。感谢雷神,中国音视频技术领域无私的拓荒者传承者,您的博文治学态度令我敬佩,文章使我受益良多
ffmpeg API变更
雷神记录获取媒体信息使用的函数是 av_find_stream_info()。但是较新的版本中,av_find_stream_info() 函数已经无法使用了,取而代之的是 avformat_find_stream_info()。
再比如,早一些的程序中,打开解码器可以使用 avcodec_open(),但是新版本的程序中必须使用 avcodec_open2()。而早期版本的 FFmpeg 中打开媒体的函数 av_open_input_file() 也已经被 avformat_open_input() 所取代。可以看出一些与 libavformat 相关的 av_***() 都变更为了 avformat_***(),这一趋势也说明 FFmpeg 的 API 正在慢慢朝着“名称更加规范”的方向发展。
ffmpeg源码结构图
编码
图片引自雷神,图片较大建议保存为本地文件,然后再查看:
函数背景色
函数在图中以方框的形式表现出来。不同的背景色标志了该函数不同的作用:
粉红色背景函数:FFmpeg的API函数。
白色背景的函数:FFmpeg的内部函数。
黄色背景的函数:URLProtocol结构体中的函数,包含了读写各种协议的功能。
绿色背景的函数:AVOutputFormat结构体中的函数,包含了读写各种封装格式的功能。
蓝色背景的函数:AVCodec结构体中的函数,包含了编解码的功能。
区域
整个关系图可以分为以下几个区域:
左边区域——架构函数区域:这些函数并不针对某一特定的视频格式。
右上方黄色区域——协议处理函数区域:不同的协议(RTP,RTMP,FILE)会调用不同的协议处理函数。
右边中间绿色区域——封装格式处理函数区域:不同的封装格式(MKV,FLV,MPEG2TS,AVI)会调用不同的封装格式处理函数。
右边下方蓝色区域——编解码函数区域:不同的编码标准(HEVC,H.264,MPEG2)会调用不同的编解码函数。
箭头线
为了把调用关系表示的更明显,图中的箭头线也使用了不同的颜色:
红色的箭头线:标志了编码的流程。
其他颜色的箭头线:标志了函数之间的调用关系。其中:
调用 URLProtocol 结构体中的函数用黄色箭头线标识;
调用 AVOutputFormat 结构体中的函数用绿色箭头线标识;
调用 AVCodec 结构体中的函数用蓝色箭头线标识。
函数所在的文件
ffmpeg学习资料点击: