解析avcC盒内SPS的时序信息时出现问题



我试图在MP4文件中解析avcC框内的SPS。由于某种原因,我没有得到预期的计时值,而其他一切都很好。使用十六进制编辑器,我提取了这些字节来处理。

byte[] spsSmall =
{
0x67, 0x42, 0xC0, 0x1E, 0x9E, 0x21, 0x81, 0x18, 0x53, 0x4D, 0x40, 0x40,
0x40, 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x03, 0xC8,
0xF1, 0x62, 0xEE
};

这是把我的剪辑。mp4转换成。H264后的H264分析器报告

Nal length 29 start code 4 bytes 
ref 3 type 7 Sequence parameter set
profile: 66
constaint_set0_flag: 1
constaint_set1_flag: 1
constaint_set2_flag: 0
constaint_set3_flag: 0
level_idc: 30
seq parameter set id: 0
log2_max_frame_num_minus4: 6
pic_order_cnt_type: 0
log2_max_pic_order_cnt_lsb_minus4: 7
num_ref_frames: 2
gaps_in_frame_num_value_allowed_flag: 0
pic_width_in_mbs_minus1: 34 (560)
pic_height_in_map_minus1: 19
frame_mbs_only_flag: 1
derived height: 320
direct_8x8_inference_flag: 1
frame_cropping_flag: 0
vui_parameters_present_flag: 1
aspect_ratio_info_present_flag: 0
overscan_info_present_flag: 0
video_signal_info_present_flag: 1
video_format: 5
video_full_range_flag: 0
colour_description_present_flag: 1
colour_primaries: 1
transfer_characteristics: 1
matrix_coefficients: 1
chroma_loc_info_present_flag: 0
timing_info_present_flag: 1
num_units_in_tick: 1
time_scale: 60
fixed_frame_scale: 1
nal_hrd_parameters_present_flag: 0
vcl_hrd_parameters_present_flag: 0
pic_struct_present_flag: 0
motion_vectors_over_pic_boundaries_flag: 1
max_bytes_per_pic_denom: 0
max_bits_per_mb_denom: 0
log2_max_mv_length_horizontal: 10
log2_max_mv_length_vertical: 10
num_reorder_frames: 0
max_dec_frame_buffering: 2

所以我应该期望num_units_in_tick为1,time_scale为60,但由于某种原因,我得到num_units_in_tick为48,time_scale为16777216。

你可以在这里找到我的实现

我检查了FFmpeg和其他实现,看看我是否错过了什么,但他们似乎和我做同样的事情。我尝试了其他剪辑,但我仍然有一切正确的除了时间信息。除了我已经知道的,医生似乎没有提供更多的信息。不仅如此,在计时信息之前,我有color_primary, transfer_characteristics, matrix_coefficients都等于1。如果我走得太远或太早,我就会得到错误的价值。我用这个精确的序列得到24位的机会非常低。所以我不知道该做什么。

我发现这个帖子说

如果你使用的是基于字段的视频,那么这将是一个字段速率,所以你必须把它减半才能获得帧率。

不知道是什么意思。即使我将位数减半(32/16)或除以2,我也不会得到与此相近的结果。

您应该从NAL中删除emulation_preventon_three_byte,即您应该搜索0x00, 0x00, 0x03字节对齐序列并从那里删除0x03。因此得到的未转义的spsSmall将是:

byte[] spsSmall =
{
0x67, 0x42, 0xC0, 0x1E, 0x9E, 0x21, 0x81, 0x18, 0x53, 0x4D, 0x40, 0x40,
0x40, 0x50, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x03, 0xC8, 0xF1, 0x62,
0xEE
};

最新更新