这里主要介绍如何使用 FFmpeg 的 API 函数 avformat_open_inputavformat_find_stream_info 来打开以及获取一个输入文件的信息。

1:avformat_open_input

打开输入文件,这个函数会生成 AVFormatContext ,函数定义如下:

int avformat_open_input(AVFormatContext **ps, const char *filename,
                        ff_const59 AVInputFormat *fmt, AVDictionary **options)

参数含义:

  • char *filename, 根据文件名的后缀来猜测以什么样的封装格式打开文件,例如 mp4,m4a 后缀的文件 都用 mov 封装格式来打开。

  • AVInputFormat *fmt,指定某一种格式,不用猜测。

  • options 这个参数,因为每种封装格式都支持很多定制参数的,例如 mp4 封装格式支持 movflags:faststart,这样可以 在录制完成之后把 moov 移动到文件头部,这样在网络里面播放 mp4 的时候,就会更快一些。

2:avformat_find_stream_info

探测函数,读取输入文件的一部分信息来分析出 各个流的情况,通常用于一些没有头信息的封装格式,例如 MPEG。定义如下

int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

以及与打开输入文件相关的结构体如下:

1 AVFormatContext ,或者叫封装格式上下文。可以理解为 MP4 或者 FLV 的容器。

2,AVStream ,容器里面的流。

扩展知识:avformat_open_input 函数不止可以打开本地文件,还可以打开网络流,例如 rtmp://xxx ,http://xxx ,tcp://xxx,udp://xxx 。