利用FFmpeg简单分析帧类型

原因:由于看了一个区分帧类型的博客,故在此编写测试程序进行验证。

概述:H264文件包含网络抽象层和视频编码层(VCL),网络抽象层负责按照特定格式化数据用于传输,视频编码层主要包含视频数据的内容,而视频编码层中又可以包含VCL类型(如I,P,B)和非VCL类型(如pps,sps),VCL类型中包含slice切片,而每个slice切片都包含head和body,通过head可以得知帧类型。

分析:通过FFmpeg提供的av_read_frame方法可知,每次调用都会获取一个完整帧,比如:第一次读取将会获得数据包含sps,pps和i帧,由于I帧数据一般较大故有可能存放在多个nalu中,故可以看到第一帧数据中将会包含多个起始字节(00 00 00 01)。此利用FFmpeg简单分析帧类型_第1张图片

通过上图可知根据nal_unit_type获得NAL类型,该类型分为(1-5)编码层和非编码层.如下:

利用FFmpeg简单分析帧类型_第2张图片

通过判断是编码层数据则可以通过Slice Header中的Slice_type获取出对应的帧类型,帧类型验证流程如下:

利用FFmpeg命令行创建一个既包含IDR也包含I帧的264文件命令行如下:

ffmpeg.exe -i q.wmv -c:v libx264 -keyint_min 50 -g 50 -sc_threshold 30 gop.264

keyint_min:表示IDR帧之间最小的帧间隔

scenecut:表示两帧之间的差异程度,用于当环境变化明显是强制插入I帧或者IDR帧.当当前插入的帧与前一个IDR帧的间隔小于keyint_min,则插入I帧,否则插入IDR帧.

sc_threshold:表示如果两帧之间差异程度的阀值,如果为0则意味着不进行强制插入.

利用上述生成的264文件进行解码可以看到获得帧类型如下:key_frame为1,pict_type为I,则知下面的为IDR帧.key_frame为0,pict_type为I则为I帧。

利用FFmpeg简单分析帧类型_第3张图片

利用FFmpeg简单分析帧类型_第4张图片

利用FFmpeg简单分析帧类型_第5张图片

利用FFmpeg简单分析帧类型_第6张图片通过AVFrame中可以得知帧的类型.

 

总结:要想获取真实的帧类型需要通过Slice层的head进行分析。

你可能感兴趣的:(FFmpeg,帧类型分析)