// FFMPEG关键结构体:
// 转载 http://blog.csdn.net/leixiaohua1020/article/details/14214577
// 2016.2.26缓存
AVFrame(位于avcodec.h)结构体通常用于存储原始数据。
===============================================================================
下面看几个主要变量的做用(在这里考虑解码的状况):
uint8_t *data[AV_NUM_DATA_POINTERS]:解码后原始数据(对视频来讲是YUV,RGB,对音频来讲是PCM)
int linesize[AV_NUM_DATA_POINTERS]:data中“一行”数据的大小。注意:未必等于图像的宽,通常大于图像的宽。
int width, height:视频帧宽和高(1920x1080,1280x720...)
int nb_samples:音频的一个AVFrame中可能包含多个音频帧,在此标记包含了几个
int format:解码后原始数据类型(YUV420,YUV422,RGB24...)
int key_frame:是不是关键帧
enum AVPictureType pict_type:帧类型(I,B,P...)
AVRational sample_aspect_ratio:宽高比(16:9,4:3...)
int64_t pts:显示时间戳
int coded_picture_number:编码帧序号
int display_picture_number:显示帧序号
int8_t *qscale_table:QP表
uint8_t *mbskip_table:跳过宏块表
int16_t (*motion_val[2])[2]:运动矢量表
uint32_t *mb_type:宏块类型表
short *dct_coeff:DCT系数,这个没有提取过
int8_t *ref_index[2]:运动估计参考帧列表(貌似H.264这种比较新的标准才会涉及到多参考帧)
int interlaced_frame:是不是隔行扫描
uint8_t motion_subsample_log2:一个宏块中的运动矢量采样个数,取log的数据结构
AVFormatContext(位于avformat.h)是一个贯穿始终的数据结构,不少函数都要用到它做为参数,
它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。
===============================================================================
下面看几个主要变量的做用(在这里考虑解码的状况):
struct AVInputFormat *iformat:输入数据的封装格式
AVIOContext *pb:输入数据的缓存
unsigned int nb_streams:视音频流的个数
AVStream **streams:视音频流
char filename[1024]:文件名
int64_t duration:时长(单位:微秒us,转换为秒须要除以1000000)
int bit_rate:比特率(单位bps,转换为kbps须要除以1000)
AVDictionary *metadata:元数据函数
AVCodecContext(位于avcodec.h)中不少的参数是编码的时候使用的
===============================================================================
下面挑一些关键的变量来看看(这里只考虑解码)。
enum AVMediaType codec_type:编解码器的类型(视频,音频...)
struct AVCodec *codec:采用的解码器AVCodec(H.264,MPEG2...)
int bit_rate:平均比特率
uint8_t *extradata; int extradata_size:针对特定编码器包含的附加信息(例如对于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差不太多)ui
AVIOContext(位于avio.h)是FFMPEG管理输入输出数据的结构体。
===============================================================================
AVIOContext中有如下几个变量比较重要:
unsigned char *buffer:缓存开始位置
int buffer_size:缓存大小(默认32768)
unsigned char *buf_ptr:当前指针读取到的位置
unsigned char *buf_end:缓存结束的位置
void *opaque:URLContext结构体编码
AVCodec(位于avcodec.h)是存储编解码器信息的结构体。
===============================================================================
下面说一下最主要的几个变量:
const char *name:编解码器的名字,比较短
const char *long_name:编解码器的名字,全称,比较长
enum AVMediaType type:指明了类型,是视频,音频,仍是字幕
enum AVCodecID id:ID,不重复
const AVRational *supported_framerates:支持的帧率(仅视频)
const enum AVPixelFormat *pix_fmts:支持的像素格式(仅视频)
const int *supported_samplerates:支持的采样率(仅音频)
const enum AVSampleFormat *sample_fmts:支持的采样格式(仅音频)
const uint64_t *channel_layouts:支持的声道数(仅音频)
int priv_data_size:私有数据的大小.net
AVStream(位于avformat.h)是存储每个视频/音频流信息的结构体。
===============================================================================
重要的变量以下所示:
int index:标识该视频/音频流
AVCodecContext *codec:指向该视频/音频流的AVCodecContext(它们是一一对应的关系)
AVRational time_base:时基。经过该值能够把PTS,DTS转化为真正的时间。FFMPEG其余结构体中也有这个字段,
可是根据个人经验,只有AVStream中的time_base是可用的。PTS*time_base=真正的时间
int64_t duration:该视频/音频流长度
AVDictionary *metadata:元数据信息
AVRational avg_frame_rate:帧率(注:对视频来讲,这个挺重要的)
AVPacket attached_pic:附带的图片。好比说一些MP3,AAC音频文件附带的专辑封面。指针
AVPacket(位于avcodec.h)是存储压缩编码数据相关信息的结构体。
===============================================================================
重要的变量有如下几个:
uint8_t *data:压缩编码的数据。
例如对于H.264来讲。1个AVPacket的data一般对应一个NAL。
注意:在这里只是对应,而不是如出一辙。他们之间有微小的差异:使用FFMPEG类库分离出多媒体文件中的H.264码流
所以在使用FFMPEG进行视音频处理的时候,经常能够将获得的AVPacket的data数据直接写成文件,从而获得视音频的码流文件。
int size:data的大小
int64_t pts:显示时间戳
int64_t dts:解码时间戳
int stream_index:标识该AVPacket所属的视频/音频流。code