AVStream

AVStream 是 FFmpeg 中用于表示媒体文件中每个流(如视频流、音频流、字幕流等)的数据结构。每个媒体文件通常包含一个或多个流,例如一个视频文件可能包含一个视频流和一个音频流。

AVFormatContext

AVFormatContext 是 FFmpeg 库中的一个核心数据结构,用于表示一个多媒体文件或流的上下文。它包含了文件或流的全局信息以及其中的各个流(如视频流、音频流、字幕流等)的详细信息。这个结构体在处理多媒体文件的过程中起着至关重要的作用,几乎所有与多媒体文件相关的操作都依赖于它。

AVFormatContext 的主要作用

AVFormatContext 是处理多媒体文件的中心,它负责:

  1. 管理文件的全局信息:包括文件的格式、持续时间、比特率等。
  2. 管理文件中的各个流:如视频流、音频流、字幕流等,每个流的信息都保存在 AVStream 结构中,AVFormatContext 通过一个流数组(streams)来管理这些流。
  3. 与多媒体文件的 I/O 操作相关:它包含文件的输入输出上下文,可以通过它来打开、读取、写入文件。
  4. 与编解码器交互:它存储了与多媒体文件中各个流的编解码器相关的参数。

AVFormatContext 是 FFmpeg 库中的一个核心数据结构,用于表示一个多媒体文件或流的上下文。它包含了文件或流的全局信息以及其中的各个流(如视频流、音频流、字幕流等)的详细信息。这个结构体在处理多媒体文件的过程中起着至关重要的作用,几乎所有与多媒体文件相关的操作都依赖于它。

AVFormatContext 的主要作用

AVFormatContext 是处理多媒体文件的中心,它负责:

  1. 管理文件的全局信息:包括文件的格式、持续时间、比特率等。
  2. 管理文件中的各个流:如视频流、音频流、字幕流等,每个流的信息都保存在 AVStream 结构中,AVFormatContext 通过一个流数组(streams)来管理这些流。
  3. 与多媒体文件的 I/O 操作相关:它包含文件的输入输出上下文,可以通过它来打开、读取、写入文件。
  4. 与编解码器交互:它存储了与多媒体文件中各个流的编解码器相关的参数。

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 的操作步骤如下:

  1. 分配并初始化
    • 使用 avformat_alloc_context() 或者通过 avformat_open_input() 直接创建并打开一个媒体文件,AVFormatContext 被初始化。
  2. 打开多媒体文件
    • 使用 avformat_open_input() 函数将 AVFormatContext 与一个多媒体文件关联,并打开该文件。
  3. 读取流信息
    • 使用 avformat_find_stream_info() 函数分析文件,获取所有流的信息,并将这些信息填充到 AVFormatContextstreams 数组中。
  4. 访问和处理流数据
    • 使用 av_read_frame() 从文件中读取音频或视频帧,通过 streams 数组中的 AVStream 访问和处理这些帧。
  5. 写入输出文件(如果是处理输出文件的场景):
    • 使用 avformat_write_header()av_interleaved_write_frame() 等函数,向输出文件中写入数据。
  6. 释放资源
    • 使用 avformat_close_input() 关闭文件,释放 AVFormatContext 及其相关资源。