Muxer复用架构—FFmpeg源码分析
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
FFmpeg 可以输出各种格式,例如 flv,mp4,rtmp,等等,这些模块的内部实现都不一样的。不过 FFmpeg 对这些格式做了统一的封装,对上层提供了一样的 API 函数。
所以无论是哪种格式,你都能用下面的流程来对其进行 Muxer(封装/复用)

avformat_alloc_output_context2()申请Muxer上下文实例的内存,并且对Muxer上下文的实例进行初始化,就是把一些字段设置一下默认值avformat_new_stream()往Muxer里面添加一个新的数据流,例如 MP4 支持多个音频流或者视频流,其他格式也类似。avio_open2()正式打开输出文件,或者打开网络流,建立 TCP 链接,建立 RTMP 链接等等。avformat_write_header()写入头部信息。av_interleaved_write_frame()对编码后的AVPacket进行封装,然后写入文件,或者推送到网络上。av_write_trailer()写入尾部信息
注意:avformat_write_header() 之后不能再调 avformat_new_stream() 添加新的数据流了,因为头部已经写进去,不能再改媒体流信息。
FFmpeg 的 Muxer 复用架构可以分为 3 个部分,以 MP4 为例,其他的格式也是类似的,如下: