转自:http://blog.csdn.net/leixiaohua1020/article/details/14214577 注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecContext FFMPEG结构体分析:AVIOContext FFMPEG结构体分析:AVCodec FFMPEG结构体分析:AVStream FFMPEG结构体分析:AVPacket FFMPEG有几个最重要的结构体,包含了解协议,解封装,解码操作,此前已经进行过分析: 在此不再详述,其中AVFrame是包含码流参数较多的结构体。本文将会详细分析一下该结构体里主要变量的含义和作用。 首先看一下结构体的定义(位于avcodec.h): AVFrame结构体一般用于存储原始数据(即非压缩数据,例如对视频来说是YUV,RGB,对音频来说是PCM),此外还包含了一些相关的信息。比如说,解码的时候存储了宏块类型表,QP表,运动矢量表等数据。编码的时候也存储了相关的数据。因此在使用FFMPEG进行码流分析的时候,AVFrame是一个很重要的结构体。 下面看几个主要变量的作用(在这里考虑解码的情况):
其他的变量不再一一列举,源代码中都有详细的说明。在这里重点分析一下几个需要一定的理解的变量: 1.data[] 对于packed格式的数据(例如RGB24),会存到data[0]里面。 对于planar格式的数据(例如YUV420P),则会分开成data[0],data[1],data[2]...(YUV420P中data[0]存Y,data[1]存U,data[2]存V) 具体参见:FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale) 2.pict_type 包含以下类型: 3.sample_aspect_ratio宽高比是一个分数,FFMPEG中用AVRational表达分数: 4.qscale_table QP表指向一块内存,里面存储的是每个宏块的QP值。宏块的标号是从左往右,一行一行的来的。每个宏块对应1个QP。 qscale_table[0]就是第1行第1列宏块的QP值;qscale_table[1]就是第1行第2列宏块的QP值;qscale_table[2]就是第1行第3列宏块的QP值。以此类推... 宏块的个数用下式计算: 注:宏块大小是16x16的。 每行宏块数: 宏块的总数: 5.motion_subsample_log2 1个运动矢量所能代表的画面大小(用宽或者高表示,单位是像素),注意,这里取了log2。 代码注释中给出以下数据: 4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2 即1个运动矢量代表16x16的画面的时候,该值取4;1个运动矢量代表8x8的画面的时候,该值取3...以此类推 6.motion_val 运动矢量表存储了一帧视频中的所有运动矢量。 该值的存储方式比较特别: 为了弄清楚该值究竟是怎么存的,花了我好一阵子功夫...注释中给了一段代码: 大概知道了该数据的结构: 1.首先分为两个列表L0和L1 2.每个列表(L0或L1)存储了一系列的MV(每个MV对应一个画面,大小由motion_subsample_log2决定) 3.每个MV分为横坐标和纵坐标(x,y) 注意,在FFMPEG中MV和MB在存储的结构上是没有什么关联的,第1个MV是屏幕上左上角画面的MV(画面的大小取决于motion_subsample_log2),第2个MV是屏幕上第1行第2列的画面的MV,以此类推。因此在一个宏块(16x16)的运动矢量很有可能如下图所示(line代表一行运动矢量的个数): 7.mb_type 宏块类型表存储了一帧视频中的所有宏块的类型。其存储方式和QP表差不多。只不过其是uint32类型的,而QP表是uint8类型的。每个宏块对应一个宏块类型变量。 宏块类型如下定义所示: 一个宏块如果包含上述定义中的一种或两种类型,则其对应的宏块变量的对应位会被置1。注:一个宏块可以包含好几种类型,但是有些类型是不能重复包含的,比如说一个宏块不可能既是16x16又是8x8。 8.ref_index 运动估计参考帧列表存储了一帧视频中所有宏块的参考帧索引。这个列表其实在比较早的压缩编码标准中是没有什么用的。只有像H.264这样的编码标准才有多参考帧的概念。但是这个字段目前我还没有研究透。只是知道每个宏块包含有4个该值,该值反映的是参考帧的索引。以后有机会再进行细研究吧。 在这里展示一下自己做的码流分析软件的运行结果。将上文介绍的几个列表图像化显示了出来(在这里是使用MFC的绘图函数画出来的) 视频帧: QP参数提取的结果: 美化过的(加上了颜色): 宏块类型参数提取的结果: 美化过的(加上了颜色,更清晰一些,s代表skip宏块): 运动矢量参数提取的结果(在这里是List0): 运动估计参考帧参数提取的结果: |
|