trace_headers 使用方法:
ffmpeg -i test.flv -c:v copy -an -bsf:v trace_headers -f null - > frame-info.txt 2>&1
执行以上命令后,ffmpeg把最终的解析信息输出到frame-info.txt文件中。
trace_headers工作原理:
解析输入文件,根据不同的封装格式映射到不同的demuxer上, 然后从中读取一个packet包。一个packet可能是一帧媒体数据,也可能是非媒体数据, 具体类型由NALU结构的nal_unit_type指定。根据不同的数据类型,来解析不同的数据信息。整个过程不涉及解码,仅是解析所有帧的头信息,所以耗时并不多。
NALU结构示意图如下:
目前常用的编码分为H264、H265两个标准,不同的标准NALU结构稍有不同,H264中,NALU header为1字节,nal_unit_type为5bit;H265中,NALU header为2字节,nal_unit_type为6bit。
以下以H264视频为例,分析经过trace_header处理后的日志信息。
SPS(Sequence ParamaterSet)关键信息:
level_idc: 码率的profile档次。
seq_parameter_set_id:当前序列参数集的id。
max_num_ref_frames: 最大参考帧数。
pic_width_in_mbs_minus1: 图片宽度为:16x(pic_width_in_mbs_minus1 +1)
pic_height_in_map_units_minus1: 图片高度为:16x(pic_height_in_map_units_minus1+1)
vui_parameters_present_flag: 指定vui结构是否存在, 里面会涉及到源颜色相关参数。
输出的SPS信息如下:
PPS(Picture Paramater Set)关键参数:
pic_parameter_set_id: 当前PPS的id。
seq_parameter_set_id: 与当前PPS对应的SPS id。
num_slice_groups_minus1: 分片个数信息。
num_ref_idx_l0_default_active_minus1: 前向参考帧帧列表中帧个数信息。
num_ref_idx_l0_default_active_minus1: 双向参考时,后向参考帧列表中帧个数信息。
pic_init_qp_minus26: 初始化量化参数,每一帧的最终量化参数有该值与slice_qa_delta综合得到。
输出的PPS信息如下:
SliceHeader关键参数信息:
slice_type: 帧类型如I、B、P等。
pic_parameter_set_id: 该帧相关联的PPS id。
slice_qp_delta: 该帧的qp偏移值。
frame_num: 该帧的相对序列号。
输出的SliceHeader信息如下:
适用场景:
视频的自动化分析,比如分析视频帧类型是否符合设置预期、分析帧qp是否在[qpmin, qpmax] 设置的范围内等等,可以很方便的检测视频是否满足客户的需求。