H.264 ビデオを RTP 経由で受信し、libavcodec でデコードしています。RTP パケットから NAL ユニットをアンパッケージしてから、avcodec に供給します (フラグメンテーション ユニットの再組み立てを含む)。
有効なデコード フレーム レートを表示しようとしています。以前は、*got_picture_ptr がゼロ以外のデコード ビデオ呼び出しが成功した後の時間をログに記録していました。これまでのところ、フレームごとに 1 つのスライスがあるビデオしか得られなかったので、これはうまくいきました。しかし、今では、I フレームと P フレームの両方が、それぞれタイプ 5 とタイプ 1 の 2 つの NAL ユニットで構成されているビデオを受信しています。フレームのいずれかのスライスを供給すると、decode_video が画像を取得したことを返し、pAVFrame->coded_picture_number がすべてのスライスから増加します。
ビデオ フレーム/画像/アクセス ユニットの開始または終了を確実に見つけるにはどうすればよいですか?
ストリームからいくつかの NAL ユニットをダンプし、h264bitstream から h264_analyze を実行しました。
4 つの NAL ユニットでの h264_analyze からの出力
!! オフセット 695262 (0xA9BDE)、サイズ 25 (0x0019) に NAL が見つかりました ==================== NAL ==================== 禁止された_ゼロ_ビット: 0 nal_ref_idc: 1 nal_unit_type : 7 (シーケンス パラメータ セット) ======= SPS ======= profile_idc: 66 制約_set0_フラグ: 1 constraint_set1_flag : 1 constraint_set2_flag: 1 制約_set3_フラグ: 0 予約済み_ゼロ_4ビット: 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 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 === アスペクト比情報提示フラグ : 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 color_description_present_flag : 0 color_primaries: 0 転送特性: 0 マトリックス係数: 0 クロマ_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 タイムスケール: 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 === 人材育成 === cpb_cnt_minus1 : 0 ビットレートスケール: 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 !! オフセット 695290 (0xA9BFA)、サイズ 4 (0x0004) で NAL が見つかりました ==================== 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 クロマ_qp_インデックス_オフセット: 0 deblocking_filter_control_present_flag : 1 Constrained_intra_pred_flag: 0 冗長_pic_cnt_present_flag: 0 transform_8x8_mode_flag: 1 pic_scaling_matrix_present_flag : 0 second_chroma_qp_index_offset : 1 !! オフセット 695297 (0xA9C01)、サイズ 50725 (0xC625) で NAL が見つかりました ==================== NAL ==================== 禁止された_ゼロ_ビット: 0 nal_ref_idc: 1 nal_unit_type : 5 (IDR ピクチャのコード化されたスライス) ======= スライスヘッダー ======= first_mb_in_slice : 0 slice_type : 2 (I スライス) 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 冗長_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 スライス_qp_デルタ: 5 sp_for_switch_flag: 0 スライス_qs_デルタ: 0 disable_deblocking_filter_idc: 0 slice_alpha_c0_offset_div2 : 0 スライス_ベータ_オフセット_div2: 0 スライス_グループ_変更_サイクル: 0 === 予測ウェイト表 === luma_log2_weight_denom: 0 彩度_log2_重み_denom: 0 luma_weight_l0_flag: 0 彩度_重み_l0_フラグ: 0 luma_weight_l1_flag: 0 彩度_重み_l1_フラグ: 0 === 参照画像リストの並べ替え === ref_pic_list_reordering_flag_l0 : 0 ref_pic_list_reordering_flag_l1 : 0 === デコードされた Ref Pic マーキング === no_output_of_prior_pics_flag : 0 long_term_reference_flag: 0 Adaptive_ref_pic_marking_mode_flag : 0 !! オフセット 746025 (0xB6229)、サイズ 38612 (0x96D4) で NAL が見つかりました ==================== NAL ==================== 禁止された_ゼロ_ビット: 0 nal_ref_idc: 1 nal_unit_type : 5 (IDR ピクチャのコード化されたスライス) ======= スライスヘッダー ======= first_mb_in_slice : 1840 slice_type : 2 (I スライス) 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 冗長_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 スライス_qp_デルタ: 5 sp_for_switch_flag: 0 スライス_qs_デルタ: 0 disable_deblocking_filter_idc: 0 slice_alpha_c0_offset_div2 : 0 スライス_ベータ_オフセット_div2: 0 スライス_グループ_変更_サイクル: 0 === 予測ウェイト表 === luma_log2_weight_denom: 0 彩度_log2_重み_denom: 0 luma_weight_l0_flag: 0 彩度_重み_l0_フラグ: 0 luma_weight_l1_flag: 0 彩度_重み_l1_フラグ: 0 === 参照画像リストの並べ替え === ref_pic_list_reordering_flag_l0 : 0 ref_pic_list_reordering_flag_l1 : 0 === デコードされた Ref Pic マーキング === 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 です。