解析文件的信息主要从AVFormatContext fmt_ctx,*AVCodecContext *codec_ctx,这两个结构体中获取,fmt_ctx 初始化的函数avformat_open_input(),codec_ctx的初始化函数avcodec_alloc_context3()
下面列举一些代码里用到的结构体成员
typedef struct AVFormatContext {
struct AVInputFormat *iformat;//输入数据的封装格式
unsigned int nb_streams;//视音频流的个数
AVStream **streams;//视音频流
char filename[1024];//文件名
int64_t duration//时长(单位:微秒us,转换为秒需要除以1000000)
int bit_rate//比特率(单位bps,转换为kbps需要除以1000)
AVDictionary *metadata//元数据
int64_t start_time;//开始的时间
......
}
typedef struct AVCodecContext {
enum AVMediaType codec_type;//编解码器的类型(视频,音频...)
struct AVCodec *codec;//采用的解码器AVCodec(H.264,MPEG2...)
int bit_rate;//平均比特率
uint8_t *extradata;//针对特定编码器包含的附加信息(例如对于H.264解码器来说,存储sps,pps等)
AVRational time_base;//根据该参数,可以把PTS转化为实际的时间(单位为秒s)
int width, height;//如果是视频的话,代表宽和高
int refs;//运动估计参考帧的个数(H.264的话会有多帧,MPEG2这类的一般就没有了)
int sample_rate;//采样率(音频)
int channels;//声道数(音频)
enum AVSampleFormat sample_fmt;//采样格式
int profile;//型(H.264里面就有,其他编码标准应该也有)
int level;//级(和profile差不太多)
.......
}
关于codec, 在libavcodec/avcode.h中定义了codec的ID
enum AVCodecID {
/* video codecs */
AV_CODEC_ID_MPEG1VIDEO,
AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
AV_CODEC_ID_MPEG2VIDEO_XVMC,
AV_CODEC_ID_H261,
AV_CODEC_ID_H263,
AV_CODEC_ID_RV10,
AV_CODEC_ID_RV20,
AV_CODEC_ID_MJPEG,
AV_CODEC_ID_MJPEGB,
....
/* audio codecs */
AV_CODEC_ID_MP2 = 0x15000,
AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
AV_CODEC_ID_AAC,
AV_CODEC_ID_AC3,
AV_CODEC_ID_DTS,
....
}
可以根据codecID来找出codec的名字,利用const char *avcodec_get_name(enum AVCodecID id)
这个函数。
关于profile,在libavcodec/avcode.h中通过宏定义来定义了音频和视频的不同profile,通过函数const char *avcodec_profile_name(enum AVCodecID codec_id, int profile)可以获取音视频的profile。
#define FF_PROFILE_UNKNOWN -99
#define FF_PROFILE_RESERVED -100
#define FF_PROFILE_AAC_MAIN 0
#define FF_PROFILE_AAC_LOW 1
#define FF_PROFILE_AAC_SSR 2
#define FF_PROFILE_AAC_LTP 3
#define FF_PROFILE_MPEG2_422 0
#define FF_PROFILE_MPEG2_HIGH 1
#define FF_PROFILE_MPEG2_SS 2
#define FF_PROFILE_MPEG2_SNR_SCALABLE 3
#define FF_PROFILE_MPEG2_MAIN 4
#define</