AVStream、AVFormatContext
AVStream
AVStream 是 FFmpeg 中用于表示媒体文件中每个流(如视频流、音频流、字幕流等)的数据结构。每个媒体文件通常包含一个或多个流,例如一个视频文件可能包含一个视频流和一个音频流。
AVFormatContext
AVFormatContext 是 FFmpeg 库中的一个核心数据结构,用于表示一个多媒体文件或流的上下文。它包含了文件或流的全局信息以及其中的各个流(如视频流、音频流、字幕流等)的详细信息。这个结构体在处理多媒体文件的过程中起着至关重要的作用,几乎所有与多媒体文件相关的操作都依赖于它。
AVFormatContext 的主要作用
AVFormatContext 是处理多媒体文件的中心,它负责:
- 管理文件的全局信息:包括文件的格式、持续时间、比特率等。
- 管理文件中的各个流:如视频流、音频流、字幕流等,每个流的信息都保存在
AVStream结构中,AVFormatContext通过一个流数组(streams)来管理这些流。 - 与多媒体文件的 I/O 操作相关:它包含文件的输入输出上下文,可以通过它来打开、读取、写入文件。
- 与编解码器交互:它存储了与多媒体文件中各个流的编解码器相关的参数。
AVFormatContext 是 FFmpeg 库中的一个核心数据结构,用于表示一个多媒体文件或流的上下文。它包含了文件或流的全局信息以及其中的各个流(如视频流、音频流、字幕流等)的详细信息。这个结构体在处理多媒体文件的过程中起着至关重要的作用,几乎所有与多媒体文件相关的操作都依赖于它。
AVFormatContext 的主要作用
AVFormatContext 是处理多媒体文件的中心,它负责:
- 管理文件的全局信息:包括文件的格式、持续时间、比特率等。
- 管理文件中的各个流:如视频流、音频流、字幕流等,每个流的信息都保存在
AVStream结构中,AVFormatContext通过一个流数组(streams)来管理这些流。 - 与多媒体文件的 I/O 操作相关:它包含文件的输入输出上下文,可以通过它来打开、读取、写入文件。
- 与编解码器交互:它存储了与多媒体文件中各个流的编解码器相关的参数。
AVFormatContext 的主要成员变量
以下是 AVFormatContext 中一些重要的成员变量:
AVInputFormat *iformat:输入文件的格式,如果这是一个输入文件,这个指针指向相应的格式结构体。AVOutputFormat *oformat:输出文件的格式,如果这是一个输出文件,这个指针指向相应的格式结构体。void *priv_data:私有数据指针,用于存储特定格式的私有数据。AVIOContext *pb:指向AVIOContext的指针,表示输入输出的上下文,用于管理 I/O 操作。unsigned int nb_streams:表示媒体文件中包含的流的数量(如有多少个视频流、音频流等)。AVStream \**streams:一个指向AVStream指针数组的指针,保存了文件中所有的流信息。int64_t duration:媒体文件的持续时间(以微秒为单位)。int bit_rate:文件的总比特率。char filename[1024]:文件名或 URL,保存当前处理的文件的路径。
AVFormatContext 的使用流程
在典型的使用流程中,AVFormatContext 的操作步骤如下:
- 分配并初始化:
- 使用
avformat_alloc_context()或者通过avformat_open_input()直接创建并打开一个媒体文件,AVFormatContext被初始化。
- 使用
- 打开多媒体文件:
- 使用
avformat_open_input()函数将AVFormatContext与一个多媒体文件关联,并打开该文件。
- 使用
- 读取流信息:
- 使用
avformat_find_stream_info()函数分析文件,获取所有流的信息,并将这些信息填充到AVFormatContext的streams数组中。
- 使用
- 访问和处理流数据:
- 使用
av_read_frame()从文件中读取音频或视频帧,通过streams数组中的AVStream访问和处理这些帧。
- 使用
- 写入输出文件(如果是处理输出文件的场景):
- 使用
avformat_write_header()和av_interleaved_write_frame()等函数,向输出文件中写入数据。
- 使用
- 释放资源:
- 使用
avformat_close_input()关闭文件,释放AVFormatContext及其相关资源。
- 使用
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 JasonQian's Blog!





