AVFormatContext 作用
AVFormatContext主要起到了管理和存储媒体文件相关信息的作用。它是一个比较重要的结构体,在FFmpeg中用于表示媒体文件的格式上下文,其中包含了已经打开的媒体文件的详细信息,包括媒体文件的格式、媒体流的信息、各个媒体流的编码格式、时长、码率等。AVFormatContext结构体管理着整个媒体文件,核心的功能包括以下几个方面:
打开、关闭媒体文件:AVFormatContext结构体负责打开和关闭媒体文件,它是解码操作的前提,解码器操作的基础。
 存储媒体文件相关信息:AVFormatContext结构体中存放了媒体文件相关信息,包括媒体文件的格式、编码信息、时间基准、时长、帧率、码率等等。用户可以从AVFormatContext结构体中获取媒体文件的相关信息,对媒体文件进行解码、转码等操作。
 解封装:AVFormatContext结构体还可以对媒体文件进行解封装的操作,从而提取出媒体文件中的音频、视频等媒体数据,以便于后续进行解码、编码、读写等操作。
在进行音视频解码、编码等操作时,AVFormatContext结构体通常是解码操作的前提和基础,它会被传递给其他的解码器、编码器、格式转换器等模块,以便于进行不同的操作。总之,AVFormatContext结构体的作用是为音视频文件的读写、解码、编码等操作提供必要的信息和载体,是FFmpeg解码器、编码器等虚拟层的基础。
AVFormatContext 结构体
AVFormatContext 是 FFmpeg 中的一个重要结构体,用于表示媒体格式的上下文信息,包括音频、视频、字幕等流的相关信息和元数据。下面给出一个详细介绍和代码示例。
结构体定义
AVFormatContext 是一个包含媒体文件元数据和解码器的结构体,其定义如下:
typedef struct AVFormatContext {
    const AVClass *av_class;   // 一个类,用于保存指向父对象的链接,用于日志记录
    struct AVInputFormat *iformat;  // 用于指定输入文件的格式以及文件读取的操作函数
    struct AVOutputFormat *oformat; // 用于指定输出文件的格式以及文件写入的操作函数
    void *priv_data;            // 指向 AVFormatContext(容器上下文)的私有数据
    AVIOContext *pb;            // 用于读取和写入媒体数据的 I/O 上下文
    int nb_streams;             // 流的数量,包括音频、视频、字幕等
    AVStream **streams;         // 指向 AVStream 结构体的指针,用于存储所有流的信息
    char *filename;             // 用于存储文件名的字符串
    int64_t start_time, duration;// 媒体文件的起始时间戳和持续时间
    int64_t bit_rate;           // 比特率,以 bit/s 计算
    uint8_t *buffer;            // 用于暂存数据的缓冲区
    int buffer_size;            // 缓冲区的大小
} AVFormatContext;
AVFormatContext 结构体的各个成员变量的作用详见以下介绍。
成员变量介绍
AVClass *av_class: 一个类,用于保存指向父对象的链接,用于日志记录;
 AVClass是FFmpeg中libavutil库中的一个结构体,用于在FFmpeg中实现类及其对象的日志和调试功能。AVClass提供了一种标准的方式来管理类及其对象,在不同的库和插件之间提供了统一的日志记录和调试接口。
AVInputFormat *iformat:用于指定输入文件的格式以及文件读取的操作函数;
 AVOutputFormat *oformat: 用于指定输出文件的格式以及文件写入的操作函数;
void *priv_data: 指向 AVFormatContext(容器上下文)的私有数据;
 priv_data成员可以用于存储和传递特定协议下使用的私有数据,常见的使用场景是实现自定义输入或输出协议。
AVIOContext *pb:用于读取和写入媒体数据的 I/O 上下文;
 AVIOContext 是libavformat库中一个表示访问媒体文件的I/O环境的结构体。它封装了对媒体文件的读取和写入操作,提供了和具体I/O操作系统相关的操作的抽象接口,实现了独立于实际操作系统的媒体文件访问接口。
int nb_streams: 流的数量,包括音频、视频、字幕等;
 AVStream **streams:指向 AVStream 结构体的指针,用于存储所有流的信息;
 AVStream是FFmpeg中libavformat库中的一个数据结构,用于表示媒体文件中的一个音频或视频流。在FFmpeg中,一个媒体文件通常包含多个音视频流,每个流对应着媒体文件中的一个轨道。AVStream通过存储音视频流的各种属性信息,方便解码和编码,对于多媒体处理和视频编辑有着至关重要的作用。
 AVStream包含了一个媒体流的所有基本信息,如类型、编解码器、时间戳、时长、帧率、码率等等。常用的成员变量有:
  char *filename: 用于存储文件名的字符串;
int64_t start_time: 媒体文件的起始时间戳;
 int64_t duration: 媒体文件的持续时间;
 int64_t bit_rate: 比特率,以 bit/s 计算;
 uint8_t *buffer: 用于暂存数据的缓冲区;
 int buffer_size: 缓冲区的大小。
代码示例
下面是一个基本的 C++ 代码示例,演示如何使用 AVFormatContext 结构体打开并读取视频文件:
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <cstring>
// FFmpeg 头文件
extern "C" {
#include <libavformat/avformat.h>
}
using namespace std;
int main(int argc, char* argv[]) {
    AVFormatContext* format_ctx = nullptr;
    // 打开待处理的视频文件
    if (avformat_open_input(&format_ctx, argv[1], nullptr, nullptr) != 0) {
        cerr << "无法打开文件" << argv[1] << endl;
        return EXIT_FAILURE;
    }
    // 获取流信息
    if (avformat_find_stream_info(format_ctx, nullptr) < 0) {
        cerr << "无法获取流信息" << endl;
        return EXIT_FAILURE;
    }
    // 输出文件格式和媒体信息
    av_dump_format(format_ctx, 0, argv[1], false);
    // 关闭视频文件
    avformat_close_input(&format_ctx);
    return EXIT_SUCCESS;
}
该代码使用 FFmpeg 打开视频文件,并通过 AVFormatContext 结构体获取视频的流信息和元数据。其中:
avformat_open_input() 函数用于打开视频文件,返回包含媒体元数据和解码器信息的 AVFormatContext 结构体;
 avformat_find_stream_info() 函数用于获取视频流信息;
 av_dump_format() 函数用于输出文件格式和媒体信息;
 avformat_close_input() 函数用于关闭视频文件并释放资源。
以上代码只是 AVFormatContext 使用的基本示例,实际使用中可能涉及到更多的成员变量和函数。
 



















