当前位置: 代码迷 >> 综合 >> ffmpeg 之 avformat 部分
  详细解决方案

ffmpeg 之 avformat 部分

热度:49   发布时间:2024-03-08 01:35:16.0

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)

获取当前数据的时序信息

  相关解决方案