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 使用的基本示例,实际使用中可能涉及到更多的成员变量和函数。