Muxer复用原理
本章主要讲解 FFmpeg 里面各种 Muxer 复用器的代码实现,例如 flv
,mp4
,rtmp
,等等。
虽然 FFmpeg 支持各种输入格式,但是他们内部的实现都不一样。不过在 FFmpeg 对这些格式做了统一的封装的,对上层提供了一样的 API 行数。
所以无论是哪种格式,你都能用下面的流程来对其进行 Demuxer(解复用)。
avformat_alloc_context()
申请Muxer
上下文的实例的内存avformat_alloc_output_context2()
对Muxer
上下文的实例进行初始化avformat_new_stream()
,往Muxer
里面添加一个新的数据流,例如 MP4 支持多个音频流或者视频流,其他格式也类似。avio_open2()
正式打开输出文件,或者打开网络流,建立 TCP 链接,建立 RTMP 链接等等。avformat_write_header()
,写入头部信息。av_interleaved_write_frame()
,对编码后的AVPacket
进行封装,然后写入文件,或者推送到网络上。
注意:avformat_write_header()
之后不能再调 avformat_new_stream()
添加新的数据流了,因为头部已经写进去,不能再改媒体流信息。
本章主要讲解上面这些统一 API 函数的内部实现,以及 flv
,mp4
等等 各个 Muxer
的内部实现。
通过本章的内容,你最终可以自己实现一个 Muxer
。