常用的 AVFormatContext 的操作,可以分为3类:
- 通用的函数,例如创建和销毁,等价于C++的构造函数和析构函数。
- 对输入视频流的读操作,用于输入处理,也就是使用_解封装器Demuxer_对视频流进行操作,是读操作。
- 对输出视频流的写操作,用于输出处理,也就是使用_封装器Muxer_对视频流进行操作,是写操作。
iformat对应的是AVInputFormat,oformat对应的是AVOutputFormat,正好说一下AVFormatContext和AVInputFormat/AVOutputFormat的区别。 AVFormatContext持有的是传递过程中的数据,这些数据在整个传递路径上都存在,或者都可以复用,AVInputFormat/AVOutputFormat中包含的是动作,包含着如何解析得到的这些数据。
AVStream **streams; 是媒体文件中包含的流数据,几条流,媒体流中分别是音频、视频、字幕等等。
- avformat_alloc_context() 创建输入媒体文件的AVFormatContext
- avformat_alloc_output_context2() 创建输出媒体文件的AVFormatContext
- av_dump_format() 打印format详情
- avformat_open_input() 打开媒体文件,探知媒体文件的封装格式。
- avformat_close_input() 关闭媒体文件
- avformat_find_stream_info() 探知媒体文件中的流信息,几条流,每条流的基本信息。
- av_read_frame() 读取媒体文件中每一帧数据,这是未解码之前的帧
- avformat_write_header() 写入输出文件的媒体头部信息
- av_interleaved_write_frame() 写入输出文件的帧信息,此帧信息已经调整了帧与帧之间的关联了。
- av_write_uncoded_frame() 写入输出文件的未编码的帧信息
- av_write_frame() 写入输出文件的已编码的帧信息
- av_write_trailer() 写入输出文件的媒体尾部信息
对于AVFormatContext的使用,主要就是读视频和写视频,下面是基本的流程:
读视频流程: