Libavcodec:解码H.264流时如何告知访问单元的结束

时间:2011-07-20 03:44:04

标签: ffmpeg h.264 libavcodec

我通过RTP接收H.264视频并使用libavcodec对其进行解码。我将NAL单元从RTP数据包中解包,然后再将它们提供给avcodec(包括重新组合碎片单元)。

我正在尝试显示有效的解码帧速率。我曾经在成功解码视频通话后记录时间,其中* got_picture_ptr非零。到目前为止,这是有效的,因为我只有视频,每帧有一个切片。但现在我收到视频,其中I帧和P帧分别由2个NAL单元组成,分别为5和1型。现在,当我提供帧的任一片时,decode_video返回它得到一张图片,并且pAVFrame-> coded_picture_number从每个片段增加。

如何可靠地查找视频帧/图片/访问单元的开头或结尾?

我从流中淘汰了一些NAL单位,并通过h264bitstream的h264_analyze运行它们。

h264_analyze对4个NAL单位的输出

!! Found NAL at offset 695262 (0xA9BDE), size 25 (0x0019) 
==================== NAL ====================
 forbidden_zero_bit : 0 
 nal_ref_idc : 1 
 nal_unit_type : 7 ( Sequence parameter set ) 
======= SPS =======
 profile_idc : 66 
 constraint_set0_flag : 1 
 constraint_set1_flag : 1 
 constraint_set2_flag : 1 
 constraint_set3_flag : 0 
 reserved_zero_4bits : 0 
 level_idc : 32 
 seq_parameter_set_id : 0 
 chroma_format_idc : 0 
 residual_colour_transform_flag : 0 
 bit_depth_luma_minus8 : 0 
 bit_depth_chroma_minus8 : 0 
 qpprime_y_zero_transform_bypass_flag : 0 
 seq_scaling_matrix_present_flag : 0 
 log2_max_frame_num_minus4 : 12 
 pic_order_cnt_type : 2 
   log2_max_pic_order_cnt_lsb_minus4 : 0 
   delta_pic_order_always_zero_flag : 0 
   offset_for_non_ref_pic : 0 
   offset_for_top_to_bottom_field : 0 
   num_ref_frames_in_pic_order_cnt_cycle : 0 
 num_ref_frames : 1 
 gaps_in_frame_num_value_allowed_flag : 0 
 pic_width_in_mbs_minus1 : 79 
 pic_height_in_map_units_minus1 : 44 
 frame_mbs_only_flag : 1 
 mb_adaptive_frame_field_flag : 0 
 direct_8x8_inference_flag : 1 
 frame_cropping_flag : 0 
   frame_crop_left_offset : 0 
   frame_crop_right_offset : 0 
   frame_crop_top_offset : 0 
   frame_crop_bottom_offset : 0 
 vui_parameters_present_flag : 1 
=== VUI ===
 aspect_ratio_info_present_flag : 1 
   aspect_ratio_idc : 1 
     sar_width : 0 
     sar_height : 0 
 overscan_info_present_flag : 0 
   overscan_appropriate_flag : 0 
 video_signal_type_present_flag : 1 
   video_format : 5 
   video_full_range_flag : 1 
   colour_description_present_flag : 0 
     colour_primaries : 0 
   transfer_characteristics : 0 
   matrix_coefficients : 0 
 chroma_loc_info_present_flag : 0 
   chroma_sample_loc_type_top_field : 0 
   chroma_sample_loc_type_bottom_field : 0 
 timing_info_present_flag : 1 
   num_units_in_tick : 1 
   time_scale : 25 
   fixed_frame_rate_flag : 0 
 nal_hrd_parameters_present_flag : 0 
 vcl_hrd_parameters_present_flag : 0 
   low_delay_hrd_flag : 0 
 pic_struct_present_flag : 0 
 bitstream_restriction_flag : 1 
   motion_vectors_over_pic_boundaries_flag : 1 
   max_bytes_per_pic_denom : 0 
   max_bits_per_mb_denom : 0 
   log2_max_mv_length_horizontal : 6 
   log2_max_mv_length_vertical : 6 
   num_reorder_frames : 0 
   max_dec_frame_buffering : 1 
=== HRD ===
 cpb_cnt_minus1 : 0 
 bit_rate_scale : 0 
 cpb_size_scale : 0 
 initial_cpb_removal_delay_length_minus1 : 0 
 cpb_removal_delay_length_minus1 : 0 
 dpb_output_delay_length_minus1 : 0 
 time_offset_length : 0 
!! Found NAL at offset 695290 (0xA9BFA), size 4 (0x0004) 
==================== NAL ====================
 forbidden_zero_bit : 0 
 nal_ref_idc : 1 
 nal_unit_type : 8 ( Picture parameter set ) 
======= PPS =======
 pic_parameter_set_id : 0 
 seq_parameter_set_id : 0 
 entropy_coding_mode_flag : 0 
 pic_order_present_flag : 0 
 num_slice_groups_minus1 : 0 
 slice_group_map_type : 0 
 num_ref_idx_l0_active_minus1 : 0 
 num_ref_idx_l1_active_minus1 : 0 
 weighted_pred_flag : 0 
 weighted_bipred_idc : 0 
 pic_init_qp_minus26 : 3 
 pic_init_qs_minus26 : 0 
 chroma_qp_index_offset : 0 
 deblocking_filter_control_present_flag : 1 
 constrained_intra_pred_flag : 0 
 redundant_pic_cnt_present_flag : 0 
 transform_8x8_mode_flag : 1 
 pic_scaling_matrix_present_flag : 0 
 second_chroma_qp_index_offset : 1 
!! Found NAL at offset 695297 (0xA9C01), size 50725 (0xC625) 
==================== NAL ====================
 forbidden_zero_bit : 0 
 nal_ref_idc : 1 
 nal_unit_type : 5 ( Coded slice of an IDR picture ) 
======= Slice Header =======
 first_mb_in_slice : 0 
 slice_type : 2 ( I slice ) 
 pic_parameter_set_id : 0 
 frame_num : 0 
 field_pic_flag : 0 
 bottom_field_flag : 0 
 idr_pic_id : 0 
 pic_order_cnt_lsb : 0 
 delta_pic_order_cnt_bottom : 0 
 redundant_pic_cnt : 0 
 direct_spatial_mv_pred_flag : 0 
 num_ref_idx_active_override_flag : 0 
 num_ref_idx_l0_active_minus1 : 0 
 num_ref_idx_l1_active_minus1 : 0 
 cabac_init_idc : 0 
 slice_qp_delta : 5 
 sp_for_switch_flag : 0 
 slice_qs_delta : 0 
 disable_deblocking_filter_idc : 0 
 slice_alpha_c0_offset_div2 : 0 
 slice_beta_offset_div2 : 0 
 slice_group_change_cycle : 0 
=== Prediction Weight Table ===
 luma_log2_weight_denom : 0 
 chroma_log2_weight_denom : 0 
 luma_weight_l0_flag : 0 
 chroma_weight_l0_flag : 0 
 luma_weight_l1_flag : 0 
 chroma_weight_l1_flag : 0 
=== Ref Pic List Reordering ===
 ref_pic_list_reordering_flag_l0 : 0 
 ref_pic_list_reordering_flag_l1 : 0 
=== Decoded Ref Pic Marking ===
 no_output_of_prior_pics_flag : 0 
 long_term_reference_flag : 0 
 adaptive_ref_pic_marking_mode_flag : 0 
!! Found NAL at offset 746025 (0xB6229), size 38612 (0x96D4) 
==================== NAL ====================
 forbidden_zero_bit : 0 
 nal_ref_idc : 1 
 nal_unit_type : 5 ( Coded slice of an IDR picture ) 
======= Slice Header =======
 first_mb_in_slice : 1840 
 slice_type : 2 ( I slice ) 
 pic_parameter_set_id : 0 
 frame_num : 0 
 field_pic_flag : 0 
 bottom_field_flag : 0 
 idr_pic_id : 0 
 pic_order_cnt_lsb : 0 
 delta_pic_order_cnt_bottom : 0 
 redundant_pic_cnt : 0 
 direct_spatial_mv_pred_flag : 0 
 num_ref_idx_active_override_flag : 0 
 num_ref_idx_l0_active_minus1 : 0 
 num_ref_idx_l1_active_minus1 : 0 
 cabac_init_idc : 0 
 slice_qp_delta : 5 
 sp_for_switch_flag : 0 
 slice_qs_delta : 0 
 disable_deblocking_filter_idc : 0 
 slice_alpha_c0_offset_div2 : 0 
 slice_beta_offset_div2 : 0 
 slice_group_change_cycle : 0 
=== Prediction Weight Table ===
 luma_log2_weight_denom : 0 
 chroma_log2_weight_denom : 0 
 luma_weight_l0_flag : 0 
 chroma_weight_l0_flag : 0 
 luma_weight_l1_flag : 0 
 chroma_weight_l1_flag : 0 
=== Ref Pic List Reordering ===
 ref_pic_list_reordering_flag_l0 : 0 
 ref_pic_list_reordering_flag_l1 : 0 
=== Decoded Ref Pic Marking ===
 no_output_of_prior_pics_flag : 0 
 long_term_reference_flag : 0 
 adaptive_ref_pic_marking_mode_flag : 0 

两个I切片显示frame_num = 0.接下来的2个(未显示)有frame_num = 1.

1 个答案:

答案 0 :(得分:0)

您对此H.264流有什么样的打包方式?例如,使用FU-A / FU-B碎片http://tools.ietf.org/html/rfc3984#page-11,您总是可以告诉NAL单元的结尾,因为它与标记为当前NALU的最后一个片段的片段的末尾对齐。