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!