FFmpeg 基础概念的理解

1. 容器/文件(Container/File):即特定格式的多媒体文件,比如MP4,flv,mov等。

2. 媒体流(Stream):表示在时间轴上的一段连续的数据,比如一段声音数据、一段视频数据或者一段字母数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器。

3. 数据帧/数据包(Frame/Packet):通常一个媒体流是由大量的数据帧组成的,对于压缩数据,帧对应着编解码器的最小处理单元,分属于不同媒体流的数据帧交错存储与容器之中。

4. 编解码器:编解码器是以帧为单位实现压缩数据和原始数据之间的相互转换的。

前面介绍的术语,就是FFmpeg中抽象出来的概念。其中:

1. AVFormatContext:就是对容器或者媒体文件层次的抽象。

2. AVStream:在文件中(容器里面)包含了多路流(音频流、视频流、字幕流),AVStream 就是对流的抽象。

3. AVCodecContext 与 AVCodec:在每一路流中都会描述这路流的编码格式,对编解码器格式以及编解码器的抽象就是AVCodecContext 与 AVCodec。

4. AVPacket 与 AVFrame:对于编码器或者解码器的输入输出部分,也就是压缩数据以及原始数据的抽象就是AVPacket与AVFrame。

5. AVFilter:除了编解码之外,对音视频的处理肯定是针对于原始数据的处理,也就是针对AVFrame的处理,使用的就是AVFilter。


FFmpeg视频解码过程

通常来说,FFmpeg的视频解码过程有以下几个步骤:

注册所支持的所有的文件(容器)格式及其对应的CODECav_register_all()

打开文件avformat_open_input()

从文件中提取流信息avformat_find_stream_info()

在多个数据流中找到视频流 video stream(类型为MEDIA_TYPE_VIDEO)

查找video stream 相对应的解码器avcodec_find_decoder

打开解码器avcodec_open2()

为解码帧分配内存av_frame_alloc()

从流中读取读取数据到Packet中av_read_frame()

对video 帧进行解码,调用avcodec_decode_video2()

推荐阅读更多精彩内容