从 SPS 损坏的 MPEG-TS 流中获取 H.264 视频尺寸
Fetch H.264 video dimensions from MPEG-TS stream with corrupted SPS
我正在编写一个 MPEG-TS 到 MP4 传输复用器,只要我从中获得具有适当尺寸和播放速度等的可播放 MP4 文件,它就可以正常工作。
但是,我不确定 VLC(或我测试过输出的任何其他视频播放器)如何确定视频的正确尺寸。我通过解析 SPS 计算出的宽度和高度值完全是垃圾;我最终得到 16x160 或 32x1529 之类的东西。
现在,MP4文件中的一个avcC框包含完整的原始SPS单元,所以我看到两种可能性:
1. 我的 SPS 解析器实际上以某种方式损坏,MP4 播放器从完整的 SPS 中正确 自己重新提取宽度、高度、轮廓和级别信息。在这种情况下,是否有可用于验证 SPS 解析器的测试用例?
2. 我的 SPS 解析器没问题,但 SPS 数据确实有问题,MP4 播放器可以通过其他方式从视频数据中检索到正确的参数。那么,那其他的手段是什么?
编辑:作为参考,这里有一些我试图解析的 SPS,以及我得到的结果:
SPS:0x674d401feca0c8edff807007088003080031e078c18cb0
pic_width_in_mbs_minus1: 0
pic_height_in_map_units_minus1: 0
frame_cropping_flag: 0
frame_mbs_only_flag: 0
宽度:16
身高:32
SPS:0x6742c015d90a07e84003040030f03c58b920
pic_width_in_mbs_minus1: 1
pic_height_in_map_units_minus1: 159
frame_cropping_flag: 1(底部偏移量为1,其余为0)
frame_mbs_only_flag: 0
宽度:32
身高:5118
SPS: 0x676401eacd940b031a100301003032f162d96
pic_width_in_mbs_minus1: 0
pic_height_in_map_units_minus1: 4
frame_cropping_flag: 0
frame_mbs_only_flag: 0
宽度:16
身高:160
我的解析器代码相当大,无法包含在此处,但在 GitHub https://github.com/gliese1337/HLS.js/blob/master/SPSParser.js
这应该仍然是您的 SPS 解析器的问题:
SPS: 0x674d401feca0c8edff807007088003080031e078c18cb0 pic_width_in_mbs_minus1: 0 pic_height_in_map_units_minus1: 0 frame_cropping_flag: 0 frame_mbs_only_flag: 0 width: 16 height: 32
Sequence Parameter Set
profile_idc 77
constraint_set0_flag 0
constraint_set1_flag 1
constraint_set2_flag 0
constraint_set3_flag 0
level_idc 31
seq_parameter_set_id 0
num_ref_frames 4
gaps_in_frame_num_value_allowed_flag 0
pic_width_in_mbs_minus1 24
pic_height_in_map_units_minus1 13
frame_mbs_only_flag 1
direct_8x8_inference_flag 1
frame_cropping_flag 0
vui_parameters_present_flag 1
分辨率:400x224
我正在编写一个 MPEG-TS 到 MP4 传输复用器,只要我从中获得具有适当尺寸和播放速度等的可播放 MP4 文件,它就可以正常工作。
但是,我不确定 VLC(或我测试过输出的任何其他视频播放器)如何确定视频的正确尺寸。我通过解析 SPS 计算出的宽度和高度值完全是垃圾;我最终得到 16x160 或 32x1529 之类的东西。
现在,MP4文件中的一个avcC框包含完整的原始SPS单元,所以我看到两种可能性: 1. 我的 SPS 解析器实际上以某种方式损坏,MP4 播放器从完整的 SPS 中正确 自己重新提取宽度、高度、轮廓和级别信息。在这种情况下,是否有可用于验证 SPS 解析器的测试用例? 2. 我的 SPS 解析器没问题,但 SPS 数据确实有问题,MP4 播放器可以通过其他方式从视频数据中检索到正确的参数。那么,那其他的手段是什么?
编辑:作为参考,这里有一些我试图解析的 SPS,以及我得到的结果:
SPS:0x674d401feca0c8edff807007088003080031e078c18cb0 pic_width_in_mbs_minus1: 0 pic_height_in_map_units_minus1: 0 frame_cropping_flag: 0 frame_mbs_only_flag: 0 宽度:16 身高:32
SPS:0x6742c015d90a07e84003040030f03c58b920 pic_width_in_mbs_minus1: 1 pic_height_in_map_units_minus1: 159 frame_cropping_flag: 1(底部偏移量为1,其余为0) frame_mbs_only_flag: 0 宽度:32 身高:5118
SPS: 0x676401eacd940b031a100301003032f162d96
pic_width_in_mbs_minus1: 0 pic_height_in_map_units_minus1: 4 frame_cropping_flag: 0 frame_mbs_only_flag: 0 宽度:16 身高:160
我的解析器代码相当大,无法包含在此处,但在 GitHub https://github.com/gliese1337/HLS.js/blob/master/SPSParser.js
这应该仍然是您的 SPS 解析器的问题:
SPS: 0x674d401feca0c8edff807007088003080031e078c18cb0 pic_width_in_mbs_minus1: 0 pic_height_in_map_units_minus1: 0 frame_cropping_flag: 0 frame_mbs_only_flag: 0 width: 16 height: 32
Sequence Parameter Set
profile_idc 77
constraint_set0_flag 0
constraint_set1_flag 1
constraint_set2_flag 0
constraint_set3_flag 0
level_idc 31
seq_parameter_set_id 0
num_ref_frames 4
gaps_in_frame_num_value_allowed_flag 0
pic_width_in_mbs_minus1 24
pic_height_in_map_units_minus1 13
frame_mbs_only_flag 1
direct_8x8_inference_flag 1
frame_cropping_flag 0
vui_parameters_present_flag 1
分辨率:400x224