FFmpeg源码结构

FFmpeg源码结构

libavformat

*AVFormatContext是API层直接接触到的结构体,它会进行格式的封装与解封装,它的数据部分由底层提供,底层使用了AVIOContext,这个AVIOContext实际上就是为普通的I/O增加了一层Buffer缓冲区,再往底层就是URLContext,也就达到了协议层,协议层的具体实现由很多,有rtmp,http,hls,file等,这就是libavformat的内部封装了。

libavcodec

*这一层我们能接触到最顶层的结构体就是AVCodecContext,该结构体包含的就是与实际的编解码有关的部分,首先AVCodecContext里是包含在一个AVStream里面的,即描述了这路流的编码格式信息,根据Codec的信息可以打开编码器或解码器进行AVPacket与AVFrame之间的转换

avformat_open_input分析

1.avformat_open_input会根据文件的路径判断文件的格式,其实就是通过这一步来绝对使用的到底是哪一个Demuxer.举例来说,如果是flv,那么Demuxer就会使用ff_flv_demuxer,所以对应的关键生命周期的方法read_header,read_packet,read_seek,read_close都会使用该flv的Demuxer中函数指针指定的函数。read_header的函数会将AVStream结构体构造好

avformat_find_stream_info分析

1.这个函数在直播场景下的拉流客户端秒开首屏,就是与该函数分析的代码实现息息相关,该方法的作用就是把所有Stream的MetaData信息填充好,方法内部会查找对应的解码器,然后打开相应的解码器,紧接着会利用Demuxer中的read_packet函数读取一段数据进行解码,当然解码的数据越多,分析出的流信息就会越准确,对于网络数据,有几个参数可以控制读取数据的长度,一个是probe size,一个是max_analyze_duration,还有一个是fps_probe_size,这三个参数共同控制解码数据的长度,当然,如果配置这几个参数的值越小,那么这个函数执行的时间就会越快,但是会导致AVStream结构体里面的一些信息(视频的宽,高,fps,编码类型等)不准确。

av_read_frame分析

1.使用该方法读取出来的数据是AVPacket,该函数的实现首先会委托到Demuxer的read_packet方法中去,当然read_packet通过解复用层和协议层的处理之后,会将数据返回到这里,在该函数中进行数据缓冲处理。音频流中,一个AVPacket可能包含多个AVFrame,但对于视频流,一个AVPacket会返回一个AVFrame的结构体

avcodec_decodec分析

1.该方法包含了两部分内容,一部分是解码视频,一部分是解码音频。解码是会委托给对应的解码器来实施的,在打开解码器的时候,就找到了对应的解码器的实现,比如对于解码H264来讲,会找到ff_h264_decoder,其中会有对应的生命周期函数的实现,最重要的是init,decode,close这三个方法,分别对应于打开解码器,解码及关闭解码器的操作。

avformat_close_input分析

1.该函数负责释放对应的资源,首先会调用对应的Demuxer中的生命周期read_close,然后释放掉AVFormatContext,最后关闭文件或者远程网络链接。

相关推荐