1

我正在通过 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 单元上的输出

!!在偏移量 695262 (0xA9BDE) 处找到 NAL,大小为 25 (0x0019)
==================== NAL ====================
 禁止零位:0
 nal_ref_idc:1
 nal_unit_type:7(序列参数集)
======= SPS =======
 profile_idc:66
 约束集0标志:1
 约束集1_标志:1
 约束集2标志:1
 约束集3_标志:0
 reserved_zero_4bits:0
 level_idc:32
 seq_parameter_set_id:0
 色度格式IDC:0
 残留颜色变换标志: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
 帧裁剪标志: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
   纵横比idc:1
     sar_width:0
     sar_height:0
 overscan_info_present_flag:0
   过扫描适当标志:0
 video_signal_type_present_flag:1
   视频格式:5
   video_full_range_flag:1
   colour_description_present_flag:0
     color_primaries : 0
   转移特性:0
   矩阵系数:0
 chroma_loc_info_present_flag:0
   chroma_sample_loc_type_top_field:0
   chroma_sample_loc_type_bottom_field:0
 时间信息呈现标志:1
   num_units_in_tick : 1
   时间尺度:25
   固定帧速率标志:0
 nal_hrd_parameters_present_flag:0
 vcl_hrd_parameters_present_flag:0
   low_delay_hrd_flag:0
 pic_struct_present_flag:0
 比特流限制标志:1
   motion_vectors_over_pic_boundaries_flag:1
   max_bytes_per_pic_denom:0
   max_bits_per_mb_denom:0
   log2_max_mv_length_horizo​​ntal:6
   log2_max_mv_length_vertical:6
   num_reorder_frames : 0
   max_dec_frame_buffering:1
=== 人力资源开发人员 ===
 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
 时间偏移长度:0
!!在偏移量 695290 (0xA9BFA) 处找到 NAL,大小为 4 (0x0004)
==================== NAL ====================
 禁止零位:0
 nal_ref_idc:1
 nal_unit_type:8(图片参数集)
======= 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
 切片组映射类型: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
 受约束的_intra_pred_flag:0
 冗余图片cnt_present_flag:0
 变换_8x8_mode_flag:1
 pic_scaling_matrix_present_flag:0
 second_chroma_qp_index_offset:1
!!在偏移量 695297 (0xA9C01) 处找到 NAL,大小为 50725 (0xC625)
==================== NAL ====================
 禁止零位:0
 nal_ref_idc:1
 nal_unit_type:5(IDR图片的编码切片)
======= 切片头 =======
 first_mb_in_slice:0
 slice_type : 2 (我切片)
 pic_parameter_set_id:0
 帧数:0
 field_pic_flag:0
 底部字段标志:0
 idr_pic_id:0
 pic_order_cnt_lsb:0
 delta_pic_order_cnt_bottom:0
 冗余图片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
=== 预测权重表 ===
 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_flag_l0:0
 ref_pic_list_reordering_flag_l1:0
=== 解码参考图片标记 ===
 no_output_of_prior_pics_flag:0
 long_term_reference_flag:0
 Adaptive_ref_pic_marking_mode_flag:0
!!在偏移量 746025 (0xB6229) 处找到 NAL,大小为 38612 (0x96D4)
==================== NAL ====================
 禁止零位:0
 nal_ref_idc:1
 nal_unit_type:5(IDR图片的编码切片)
======= 切片头 =======
 first_mb_in_slice:1840
 slice_type : 2 (我切片)
 pic_parameter_set_id:0
 帧数:0
 field_pic_flag:0
 底部字段标志:0
 idr_pic_id:0
 pic_order_cnt_lsb:0
 delta_pic_order_cnt_bottom:0
 冗余图片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
=== 预测权重表 ===
 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_flag_l0:0
 ref_pic_list_reordering_flag_l1:0
=== 解码参考图片标记 ===
 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。

4

1 回答 1

0

您对这个 H.264 流有什么样的分组?例如,使用 FU-A/FU-B 碎片https://www.rfc-editor.org/rfc/rfc3984#page-11你总是可以告诉 NAL 单元的结尾,因为它与标记为最后一个片段的片段结尾对齐对于当前的 NALU。

于 2011-09-07T14:11:36.047 回答