AVFormatContext
封装格式上下文结构体,统领全局的结构体,保存音视频文件封装格式相关信息。
结构体常用成员:
ff_const59 struct AVInputFormat *iformat;// 输入数据的格式
ff_const59 struct AVOutputFormat *oformat;// 输出数据格式
AVIOContext *pb;// I / O上下文
unsigned int nb_streams;//文件媒体流的数量,只能由avformat_new_stream()设置
AVStream **streams;// 文件中所有流的列表
char filename[1024];// 输入或输出文件名
start_time、duration、bit_rate// 第一帧开始时间、总时长、码率
AVDictionary *metadata;// 元数据
AVformatContext简单示例:
#include <stdio.h>
#include <libavformat/avformat.h>
int main(int argc, char **argv)
{
const char *in_filename = "xxx.mp4";
//AVFormatContext是描述一个媒体文件或媒体流的构成和基本信息的结构体
AVFormatContext *ifmt_ctx = NULL; // 输入文件的demux
// 打开文件,探测协议类型,创建url
int ret = avformat_open_input(&ifmt_ctx, in_filename, NULL, NULL);
//获取流信息
ret = avformat_find_stream_info(ifmt_ctx, NULL);
//打开媒体文件成功
printf_s("\n==== av_dump_format in_filename:%s ===\n", in_filename);
av_dump_format(ifmt_ctx, 0, in_filename, 0);//输出文件格式,媒体文件信息
printf_s("\n==== av_dump_format finish =======\n\n");
// url: 调用avformat_open_input读取到的媒体文件的路径/名字
printf("media name:%s\n", ifmt_ctx->url);
// nb_streams: nb_streams媒体流数量
printf("stream number:%d\n", ifmt_ctx->nb_streams);
// bit_rate: 媒体文件的码率,单位为bps /1024转为kbps
printf("media average ratio:%lldkbps\n",(int64_t)(ifmt_ctx->bit_rate/1024));
// 时间
int total_seconds, hour, minute, second;
// duration: 媒体文件时长,单位微妙
//ffmpeg中的内部计时单位(时间戳),AVStream中的duration以这个流的长度为duration个AV_TIME_BASE
total_seconds = (ifmt_ctx->duration) / AV_TIME_BASE; // 1000us = 1ms, 1000ms = 1秒 得到多少秒时长
hour = total_seconds / 3600;
minute = (total_seconds % 3600) / 60;
second = (total_seconds % 60);
//媒体文件的总时长(经过时分秒转化)
printf("total duration: %02d:%02d:%02d\n", hour, minute, second);
printf("\n");
getchar();
return 0;
}