分析工具:FLVAnalyser、WinHex
/*============================================================================
FLV格式分析
------------------------------------------------------------------------------
FILE Header:固定9字节
------------------------------------------------------------------------------
FLV header (9 bytes)
Signature: FLV(3字节):文件标示
Version: 1 (0x01)(1字节):版本
Flags: 5 (0x05)(1字节):第六位标示音频,第七位保留,第八位标示视频
Video: Yes
Audio: Yes
Size: 9 (0x00000009)(4字节)
------------------------------------------------------------------------------
FILE Body:
------------------------------------------------------------------------------
由很多Tag组成,Tag = Tag Header(15字节) + Tag Data
Header(15 bytes)
PreviousTagSize:
Type : 8 (0x08)(1字节):标示Tag类型。8:音频;9:视频,18:字幕
BodyLength : 418 (0x0001A2)(3字节):data大小
Timestamp_Base : 26 (0x00001A)(3字节):时间戳
Timestamp_Extended : 0 (0x00)(1字节):时间戳扩展字节
StreamID : 0 (0x000000)(3字节):stream的ID,总是为0.
================================================================================
*/
AAC格式:MediaInfo、WinHex
/*-----------------------------------------------------------------------------------------------
ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个
音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。
故这种格式常用在磁盘文件中。
ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,
解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。
-------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
ADTS
-------------------------------------------------------------------------------------------------
adts_frame - 0 (0x0) (378 bytes)
00000 adts_fixed_header (3 bytes) [28 bits]
00000 syncword: 4095 (0xFFF) - (12 bits)
00001 id: No - MPEG-4
00001 layer: 0 (0x0) - (2 bits)
00001 protection_absent: Yes
00002 profile_ObjectType: 1 (0x1) - (2 bits) - AAC LC
00002 sampling_frequency_index: 4 (0x4) - (4 bits) - 44100 (0xAC44) Hz
00002 private: No
00002 channel_configuration: 2 (0x2) - (3 bits)
00003 original: No :set to 0 when encoding, ignore when decoding
00003 home: No
00003 adts_variable_header (4 bytes)
00003 copyright_id: No
00003 copyright_id_start: No
00003 aac_frame_length: 378 (0x017A) - (13 bits)
00005 adts_buffer_fullness: 2047 (0x7FF) - (11 bits) - VBR
00006 num_raw_data_blocks: 0 (0x0) - (2 bits)
00007 raw_data_block (378 bytes)
00000 CPE - channel_pair_element (14 bytes)
00007 id_syn_ele: 1 (0x1) - (3 bits) - CPE - channel_pair_element
00003 FIL - fill_element (282 bytes)
0000E id_syn_ele: 6 (0x6) - (3 bits) - FIL - fill_element
00004 FIL - fill_element (373 bytes)
0011D id_syn_ele: 6 (0x6) - (3 bits) - FIL - fill_element
00005 END - End (372 bytes)
00179 id_syn_ele: 7 (0x7) - (3 bits) - END - End
00179 byte_alignment: 0 (0x0) - (2 bits)
-------------------------------------------------------------------------------------------------------
序号 域 长度(bits) 说明
1 Syncword 12 all bits must be 1
2 MPEG version 1 0 for MPEG-4, 1 for MPEG-2
3 Layer 2 always 0
4 Protection Absent 1 et to 1 if there is no CRC and 0 if there is CRC
5 Profile 2 the MPEG-4 Audio Object Type minus 1
6 MPEG-4 Sampling Frequency Index 4 MPEG-4 Sampling Frequency Index (15 is forbidden)
7 Private Stream 1 set to 0 when encoding, ignore when decoding
8 MPEG-4 Channel Configuration 3 MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE)
9 Originality 1 set to 0 when encoding, ignore when decoding
10 Home 1 set to 0 when encoding, ignore when decoding
11 Copyrighted Stream 1 set to 0 when encoding, ignore when decoding
12 Copyrighted Start 1 set to 0 when encoding, ignore when decoding
13 Frame Length 13 this value must include 7 or 9 bytes of header length: FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame)
14 Buffer Fullness 11 buffer fullness
15 Number of AAC Frames 2 number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame
16 CRC 16 CRC if protection absent is 0
*-----------------------------------------------------------------------------------------------*/
AVC格式:MediaInfo、WinHex
/*-----------------------------------------------------------------------------------------------------------------------
NALU:由RBSP打包生成,构成了NAL单元流,即H264码流。
-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------
IDR帧 slice
-------------------------------------------------------------------------------------------------------------------------
slice_layer_without_partitioning (IDR) - 0 (0x0) - Frame 0 - slice_type I - frame_num 0 - pic_order_cnt_lsb 0 (9984 bytes)
Header (5 bytes)
zero_byte: 0 (0x00)
start_code_prefix_one_3bytes: 1 (0x000001)
nal_ref_idc: 3 (0x3) - (2 bits) :当前帧重要性【0-3】
nal_unit_type: 5 (0x05) - (5 bits) :当前NAL类型:5:IDR;7:SPS;8:PPS
slice_header (4 bytes)
first_mb_in_slice: 0 (0x0) :当前slice中包含的第一个宏块在整帧中的位置
slice_type: 7 (0x07) - I :slice类型:I/P/B/SI/SP
pic_parameter_set_id: 0 (0x0) :当前slice所依赖的pps的id
frame_num: 0 (0x0) :帧号
field_pic_flag :当前slice是否进行的是场编码
bottom_field_flag :当前slice是否在底场(bottom field
idr_pic_id: 0 (0x0) :表示IDR帧的序号
pic_order_cnt_lsb: 0 (0x00) :当前帧号的另一个种计量方式
no_output_of_prior_pics_flag: No
long_term_reference_flag: No
slice_qp_delta: -8 (0xFFFFFFF8) :slice所使用的初始qp值
disable_deblocking_filter_idc: 0 (0x0)
slice_alpha_c0_offset_div2: 0 (0x0)
slice_beta_offset_div2: 0 (0x0)
slice_data (9973 bytes)
(ToDo): (Data)
--------------------------------------------------------------------------------------------------------------------------
P帧
--------------------------------------------------------------------------------------------------------------------------
slice_layer_without_partitioning (non-IDR) - 6 (0x6) - Frame 1 - slice_type P - frame_num 1 - pic_order_cnt_lsb 6 (1958 bytes)
Header (5 bytes)
zero_byte: 0 (0x00)
start_code_prefix_one_3bytes: 1 (0x000001)
nal_ref_idc: 2 (0x2) - (2 bits)
nal_unit_type: 1 (0x01) - (5 bits)
slice_header (4 bytes)
first_mb_in_slice: 0 (0x0)
slice_type: 5 (0x5) - P
pic_parameter_set_id: 0 (0x0) :设置使用的图像参数集编号
frame_num: 1 (0x1)
pic_order_cnt_lsb: 6 (0x06)
num_ref_idx_active_override_flag (0 bytes)
num_ref_idx_active_override_flag: Yes
num_ref_idx_l0_active_minus1: 0 (0x0)
ref_pic_list_modification_flag_l0: No
luma_log2_weight_denom: 0 (0x0)
chroma_log2_weight_denom: 0 (0x0)
luma_weight_l0_flag: No
chroma_weight_l0_flag: No
adaptive_ref_pic_marking_mode_flag: No
cabac_init_idc: 0 (0x0)
slice_qp_delta: -7 (0xFFFFFFF9)
disable_deblocking_filter_idc: 0 (0x0)
slice_alpha_c0_offset_div2: 0 (0x0)
slice_beta_offset_div2: 0 (0x0)
slice_data (1949 bytes)
(ToDo): (Data)
--------------------------------------------------------------------------------------------------------------------------
B帧
--------------------------------------------------------------------------------------------------------------------------
slice_layer_without_partitioning (non-IDR) - 2 (0x2) - Frame 2 - slice_type B - frame_num 2 - pic_order_cnt_lsb 2 (206 bytes)
Header (5 bytes)
zero_byte: 0 (0x00)
start_code_prefix_one_3bytes: 1 (0x000001)
nal_ref_idc: 2 (0x2) - (2 bits)
nal_unit_type: 1 (0x01) - (5 bits)
slice_header (4 bytes)
first_mb_in_slice: 0 (0x0)
slice_type: 6 (0x6) - B
pic_parameter_set_id: 0 (0x0)
frame_num: 2 (0x2)
pic_order_cnt_lsb: 2 (0x02)
direct_spatial_mv_pred_flag: Yes
num_ref_idx_active_override_flag (0 bytes)
num_ref_idx_active_override_flag: Yes
num_ref_idx_l0_active_minus1: 0 (0x0)
num_ref_idx_l1_active_minus1: 0 (0x0)
ref_pic_list_modification_flag_l0: No
ref_pic_list_modification_flag_l1: No
adaptive_ref_pic_marking_mode_flag: No
cabac_init_idc: 0 (0x0)
slice_qp_delta: -5 (0xFFFFFFFB)
disable_deblocking_filter_idc: 0 (0x0)
slice_alpha_c0_offset_div2: 0 (0x0)
slice_beta_offset_div2: 0 (0x0)
slice_data (196 bytes)
(ToDo): (Data)
--------------------------------------------------------------------------------------------------------------------------
SPS
--------------------------------------------------------------------------------------------------------------------------
seq_parameter_set (37 bytes)
seq_parameter_set (37 bytes))
Header (5 bytes)
zero_byte: 0 (0x00) : 当前的NAL单元为sps、pps或者一个访问单元(access unit)的第一个NAL单元
start_code_prefix_one_3bytes: 1 (0x000001) :固定存在的NAL单元起始码,用来指示下面为一个NAL单元
nal_ref_idc: 3 (0x3) - (2 bits) :当前NAL单元的重要性
nal_unit_type: 7 (0x07) - (5 bits):NAL单元类型
profile_idc: 77 (0x4D):主要用来规定编码时是否采用某些特性,Baseline profile就规定了只能使用I、P slice进行编码
constraints (1 bytes)
constraint_set0_flag: No : 强制使用Baseline profile进行编码
constraint_set1_flag: Yes:强制使用Main profile进行编码
constraint_set2_flag: No:强制使用Extended profile进行编码
constraint_set3_flag: No
constraint_set4_flag: No
constraint_set5_flag: No
reserved_zero_2bits: 0 (0x0) - (2 bits):两个0bit的保留位
level_idc: 31 (0x1F) - (8 bits):本视频遵循的level,level主要规定了每秒最多能处理多少个宏块,
最大的帧大小,最大的解码缓存,最大比特率等这些性能相关的东西,
如果是硬解码,则比较容易出现由于视频level太高而不能解码的情况。
seq_parameter_set_id: 0 (0x0):本SPS的ID,这个ID主要是给PPS用的
log2_max_frame_num_minus4: 0 (0x0)
pic_order_cnt_type: 0 (0x0)
log2_max_pic_order_cnt_lsb_minus4: 2 (0x2)
max_num_ref_frames: 4 (0x4):参考帧最多能有多少个
gaps_in_frame_num_value_allowed_flag: No:由于码流在传输过程中可能出现丢包的情况,从而导致中间有帧缺失,
如果制定了这个标记,则会在解码时对帧丢失的情况进行调整,否则就当作意外丢失处理
pic_width_in_mbs_minus1: 62 (0x03E):图片宽度(宏块为单位)-1
pic_height_in_map_units_minus1: 25 (0x19) :图片高度(宏块为单位)-1
frame_mbs_only_flag: Yes :是否只进行帧编码
direct_8x8_inference_flag: Yes :是否子宏块(8x8块)中的4个4x4块共用一个4x4的co-locate
frame_cropping_flag (1 bytes) :是否需要对解码后的图片进行修剪
frame_cropping_flag: Yes
frame_crop_left_offset: 0 (0x0)
frame_crop_right_offset: 4 (0x4)
frame_crop_top_offset: 0 (0x0)
frame_crop_bottom_offset: 0 (0x0)
vui_parameters_present_flag (21 bytes)
vui_parameters_present_flag: Yes :是否需要对解码后的图片进行修剪
aspect_ratio_info_present_flag (5 bytes)
aspect_ratio_info_present_flag: Yes
aspect_ratio_idc: 255 (0xFF) - (8 bits)
sar_width: 3328 (0x0D00) - (16 bits)
sar_height: 3325 (0x0CFD) - (16 bits)
overscan_info_present_flag: No
video_signal_type_present_flag (4 bytes)
video_signal_type_present_flag: Yes
video_format: 5 (0x5) - (3 bits) -
video_full_range_flag: 0 (0x0) - (1 bits) - Limited
colour_description_present_flag (3 bytes)
colour_description_present_flag: Yes
colour_primaries: 1 (0x01) - (8 bits) - BT.709
transfer_characteristics: 1 (0x01) - (8 bits) - BT.709
matrix_coefficients: 1 (0x01) - (8 bits) - BT.709
chroma_loc_info_present_flag: No
timing_info_present_flag (8 bytes)
timing_info_present_flag: Yes
num_units_in_tick: 1 (0x00000001) - (32 bits)
time_scale: 48 (0x00000030) - (32 bits)
fixed_frame_rate_flag: No
nal_hrd_parameters_present_flag: No
vcl_hrd_parameters_present_flag: No
pic_struct_present_flag: No
bitstream_restriction_flag (3 bytes)
bitstream_restriction_flag: Yes
motion_vectors_over_pic_boundaries_flag: Yes
max_bytes_per_pic_denom: 0 (0x0)
max_bits_per_mb_denom: 0 (0x0)
log2_max_mv_length_horizontal: 11 (0x0B)
log2_max_mv_length_vertical: 11 (0x0B)
max_num_reorder_frames: 2 (0x2)
max_dec_frame_buffering: 4 (0x4)
-------------------------------------------------------------------------------------------------------------
PPS
-------------------------------------------------------------------------------------------------------------
pic_parameter_set (8 bytes)
Header (5 bytes)
zero_byte: 0 (0x00)
start_code_prefix_one_3bytes: 1 (0x000001)
nal_ref_idc: 3 (0x3) - (2 bits)
nal_unit_type: 8 (0x08) - (5 bits)
pic_parameter_set_id: 0 (0x0) :当前PPS的ID,供slice RBSP使用
seq_parameter_set_id: 0 (0x0) :当前PPS所属的SPS的ID
entropy_coding_mode_flag: Yes:为0时表明采用CAVLC编码,为1时采用CABAC编码
bottom_field_pic_order_in_frame_present_flag: No
num_slice_groups_minus1: 0 (0x0):进行图像编码时,分成几个slice group
num_ref_idx_l0_default_active_minus1: 2 (0x2)
num_ref_idx_l1_default_active_minus1: 0 (0x0): 分别指示前向参考图像以及后向参考图像的个数
weighted_pred_flag: Yes:用于指示P,SP slice是否进行亮度的加权预测
weighted_bipred_idc: 2 (0x2) - (2 bits):用于指示B slice的加权预测,
:0:否 1:显式加权预测 2:隐式加权预测
pic_init_qp_minus26: 0 (0x0):用于计算初始QP
pic_init_qs_minus26: 0 (0x0):用于计算SP,SI帧的初始QP
chroma_qp_index_offset: 0 (0x0):色度宏块Cb与亮度宏块Y的QP差值
deblocking_filter_control_present_flag: Yes :是否进行deblocking
constrained_intra_pred_flag: No
redundant_pic_cnt_present_flag: No :如果当前视频中冗余图像的话(SI,SP),那么这个flag应该为1
----------------------------------------------------------------------------------------------------------------------------*/