1 描述
它是一个I/O 和muxing/demuxing库,处理各种媒体容器格式库,主要包括两大功能:demuxing ,如将一个媒体文件拆分成音视频流, muxing,如将音视频数据写入一个媒体文件中。同时它还具有I/O module 可支持各种协议,如文件,tcp,http等等。muing 由AVInputFormat 结构体去描述,相反地,demuxing 由AVOutputFormat 去描述。
AVFormatContext 它是整个AVFormat 的上下文, 所有有关demuxing/muxing 都包含这结构体中。其中最重要的三个成员是:
1 struct AVInputFormat *iformat;/ struct AVOutputFormat *oformat;//muxing/demuxing 上下文
2 AVStream **streams;//存在音视频流
3 AVIOContext *pb;//读取媒体数据。
2 解复用器
解复用器读取媒体文件,并将其分割成数据块(视频/音频/字幕),a packet 包含一个或者多个已编码音视频单元,通过avformat_open_input() 去打开这文件,通过av_read_frame() 去读取数据包,最后通过avformat_close_input去关闭清除。如下表为FFMPEG Demuxing 部分开出来的API ,其定义是在avformat.h 文件中,实现在utils.c 文件中。如下表为demuxing 部分开出的API。
| 函数原型 |
作用 |
| AVInputFormat *av_find_input_format(char *name) |
获得一个基于后缀名的AVInputFormat结构体 |
| AVInputFormat* av_probe_input_format(AVProbeData*pd , is_opened) |
根据Probe data 去获得一个AVInputFormat结构体 |
| AVInputFormat * av_probe_input_format2(*pd, is_opend,*score_max) |
根据Probe dat 去获得一个AVInputFormat结构体,当且只有获得的分数大于指定的分数才行 |
| AVInputFormat* av_probe_input_format3(pd,is_opend,*score_ret) |
根据probe data去获得一个AVInPutFormat 结构体,并返回获得score |
| av_probe_input_buffer2(AVIOContext*,AVInputFormat*,char *url,logctx,offset,max_probe) |
探测字节流,决定AVInputFormat |
| int avformat_open_input(AVFormatContext **, char*url,AVInputFormat *,AVDictionnary*) |
打开一个流,并读取文件头 |
| int avformat_find_stream_info(AVFormatContext*,AVDictionary*) |
读取packets, 并获得一些media information |
| av_find_best_stream(AVFormatContext*,AVMediaType,AVCodec**) |
根据输入参数找解码器 |
| avProgram*av_find_program_from_stream(AVFormatContext *,AVProgram *last,int s) |
获得program |
| int av_read_frame(AVFormatContext *s,AVPacket*pkt) |
获取stream next frame |
| int av_seek_frame(AVFormatContext *s,int stream_index,int64_t timestamp,int flag) |
seek to the keyframestamp |
| int avformat_seek_file(AVFormatContext *s,int stream_index,int min_ts,int ts,int max_ts) |
通过指定min_ts,max_ts,去找最接近target ts timestamp |
| int avformat_flush(AVFormatContext *s) |
flush all buffered data |
| int av_read_play(AVFormatContext *s) |
开始播放一个网络流 |
| int av_read_pause(AVFormatContext *s) |
暂停一个网络流 |
| void avformat_close_input(AVFormatContext**) |
关闭一个打开的AVFormatContext |
3 复用器
复用器接收AVPacket 数据,并将其写入到指定的容器格式,avformat_write_header() 用于写文件头,av_write_frame()/av_interleaved_write_frame() 写数据packet, av_write_tailer() 用于完成文件。
Muxers 以AVPackets 形式接收数据,并写入指定的容器格式。其API 定义与avformat.c,实现位于util.c 中.如下表为muxing 部分开出的API。
| 函数原型 |
作用 |
| int avformat_write_header(AVFormatContext *s,AVDictionary **options) |
allocate stream private data,并将stream 头写入container |
| int avformat_init_output (AVFormatContext*,AVDictionary **options) |
allocate stream private data,但不写入streame head |
| int av_write_frame(AVFomatContext *s,AVPacker*pkt) |
写packet 到输出的文件 |
| int av_interleaved_write_frame(AVFormatContext *s,AVPacket *pkt) |
写入packet 到输出文件,其data 必须是interleaved |
| int av_write_uncoded_frame(AVFomartContext *s,int stream_index ,AVFrame *frame) |
写未编码的data到输出文件, 其数据格式可以不是interleaved |
| int av_interleaved_write_uncoded_frame(AVFormatContext *s,int stream_index,AVFrame *frame) |
写入未编码的data, 其数据格式必须是interleaved |
| int av_write_uncoded_frame_query(AVFormatContext *s,int stream_index) |
测试muxer 是否支持写入uncoded 数据 |
| int av_write_tailer(AVFormatContext *s) |
将stream 尾写入输出文件,并free private data |
| AVOutputFormat *av_guess_format(char *short_name,char *filename,char *mime_type) |
根据输入参数,获得AVOutputForamt |
| AVCodecID av_guess_codec(AVOutputFormat *fmt,char *short_name,char*filename,char*mine_type,AVMediaType type) |
根据输入参数获得CodecID |
| int av_get_output_timestamp(struct AVFormatContext *s,int stream,int64_t * dts,int64* wall) |
获取当前数据的时序信息 |