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