欢迎诸位来阅读在下的博文~
在这里,在下会不定期发表一些浅薄的知识和经验,望诸位能与在下多多交流,共同努力
文章目录
前期博客
FFmpeg的入门实践系列一(环境搭建)
FFmpeg的入门实践系列二(基础知识)
FFmpeg的入门实践系列三(基础知识)
FFmpeg的入门实践系列四(AVS)
参考书籍
《FFmpeg开发实战——从零基础到短视频上线》——欧阳燊
一、AVFormatContext结构体
AVFormatContext
是 FFmpeg 中用于处理多媒体文件格式的一个核心结构体。它包含了文件的格式信息,以及与文件相关的流信息,如音频流、视频流和字幕流。以下是 AVFormatContext
的详细信息:
1. 结构定义
typedef struct AVFormatContext {
const AVClass *av_class; // AVClass提供日志处理等功能
struct AVInputFormat *iformat; // 输入格式
struct AVOutputFormat *oformat;// 输出格式
void *priv_data; // 私有数据,特定于输入或输出格式
AVIOContext *pb; // 读写数据的IO上下文
int ctx_flags; // 上下文标志
unsigned int nb_streams; // 流的数量
AVStream **streams; // 指向流的指针数组
char filename[1024]; // 文件名
// 一些时间基准和时长信息
int64_t duration; // 文件时长
int64_t bit_rate; // 比特率
unsigned int packet_size; // 数据包大小
int max_delay; // 最大延迟
// 其他与解码、时序、元数据等相关的字段
AVDictionary *metadata; // 文件元数据,如标题、作者等
// 其他字段省略...
} AVFormatContext;
2. 字段说明
av_class
:指向AVClass
的指针,用于日志处理、调试和其他全局设置。iformat
和oformat
:分别指向输入格式和输出格式结构体。用于定义当前上下文是用于输入还是输出。priv_data
:格式特定的私有数据,通常由特定的输入或输出格式使用。pb
:AVIOContext
用于管理输入输出操作的上下文,比如读写文件或网络数据。ctx_flags
:用于标志一些上下文状态,比如是否允许缺少流、是否实时流等。nb_streams
:表示文件中包含的流的数量(音频流、视频流、字幕流等)。streams
:一个指向AVStream
指针数组的指针,每个AVStream
结构体包含一个具体流的信息。filename
:文件名或 URL,用于标识输入或输出资源。duration
:表示文件的总时长,以 AV_TIME_BASE(通常是微秒)为单位。bit_rate
:文件的总比特率(包括所有流)。packet_size
:数据包的大小,主要用于输出。max_delay
:最大延迟,用于管理实时流的延迟处理。metadata
:文件的元数据,存储在一个AVDictionary
中。
3.示例1(打开与关闭音视频文件)
#include <stdio.h>
#ifdef __cplusplus
extern "C"
{
#endif
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
#ifdef __cplusplus
};
#endif
int main(int argc, char** argv){
const char* filename = "./fuzhou.mp4";
if(argc > 1){
filename = argv[1];
}
AVFormatContext* fmt_ctx = NULL;
//打开音视频文件
int ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL);
if(ret < 0){
av_log(NULL, AV_LOG_ERROR, "open file:%s fail\n", filename);
return -1;
}
av_log(NULL, AV_LOG_INFO, "success open input_file %s \n", filename);
// 查找音视频文件中的流信息
ret = avformat_find_stream_info(fmt_ctx, NULL);
if(ret < 0){
av_log(NULL, AV_LOG_ERROR, "find streaminfo fail\n");
return -1;
}
av_log(NULL, AV_LOG_INFO, "success find streaminfo\n");
const AVInputFormat* iformat = fmt_ctx->iformat