我正在通过 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_horizontal: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。