FLV、AAC、AVC封装格式分析

分析工具: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
----------------------------------------------------------------------------------------------------------------------------*/

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ffmpeg 是一个强大的多媒体处理工具,可以用来进行音视频的转码、剪辑、合并等操作。换封装格式就是通过ffmpeg来将一个音视频文件封装格式进行转换,而不改变其中的编码格式或者内容。 使用ffmpeg进行换封装格式时,首先需要了解原始文件封装格式,如MP4、AVI、FLV等。然后通过ffmpeg的命令行工具或者编程接口,指定需要转换的目标封装格式,比如将MP4文件转换为MKV格式。 ffmpeg 提供了丰富的命令行选项和参数,可以根据需要对音视频文件进行各种定制化的转换。比如可以指定转换后的音视频码率、分辨率、帧率等参数,也可以对音频进行编解码的调整,以满足不同的需求。 对于使用命令行工具的用户,可以通过输入相应的ffmpeg命令来进行封装格式的转换,比如: ```shell ffmpeg -i input.mp4 -c copy output.mkv ``` 上述命令中,表示将input.mp4转换为output.mkv,其中“-c copy”表示不进行编码操作,只是简单地将原始文件重新封装。 对于需要在代码中使用ffmpeg的开发者来说,可以通过调用ffmpeg提供的API来实现封装格式的转换。这样可以更加灵活地控制音视频转换的流程、参数和扩展功能。 总的来说,通过ffmpeg进行封装格式的转换是一项非常高效和灵活的操作,可以满足各种需求,并且对于不熟悉具体音视频格式的用户来说,也是一个非常方便的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值