Получить размеры видео H.264 из потока MPEG-TS с поврежденным SPS

Я пишу преобразователь MPEG-TS в MP4, который в основном работает, поскольку я получаю из него воспроизводимые файлы MP4, которые имеют правильные размеры, скорость воспроизведения и так далее.

Однако я не уверен, как VLC (или любой другой видеоплеер, на котором я тестировал свой вывод) выясняет, каковы правильные размеры для видео. Значения ширины и высоты, которые я вычисляю при анализе SPS, являются полным мусором; Я получаю такие вещи, как 16x160 или 32x1529.

Теперь блок avcC в файле MP4 содержит полную исходную единицу 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

СПС: 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


person Logan R. Kearsley    schedule 09.05.2015    source источник
comment
Я бы сначала проверил синтаксический анализатор, это объясняет, как преобразовывать значения из битового потока в размеры в пикселях: Извлечение размеров потока H264Video   -  person Roman R.    schedule 09.05.2015
comment
@РоманР. Я построил синтаксический анализатор SPS, работая непосредственно со спецификацией, используя те же таблицы, что и в этом ответе. Если с парсером что-то не так, я не думаю, что повторный просмотр той же ссылки поможет, поэтому я задаюсь вопросом, есть ли, возможно, известные тестовые примеры, с которыми я могу его запустить.   -  person Logan R. Kearsley    schedule 09.05.2015
comment
Почему бы не показать ваши SPS-байты (или парсер, или и то, и другое), которые дают вам нежелательные размеры.   -  person Roman R.    schedule 09.05.2015
comment
Это хорошая идея. Я отредактировал вопрос, чтобы включить примеры.   -  person Logan R. Kearsley    schedule 09.05.2015


Ответы (1)


Это все еще должно быть проблемой с вашим парсером 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

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

person Roman R.    schedule 09.05.2015
comment
Оказалось, что это ошибка на один байт. Спасибо за правильный ответ для использования в качестве ссылки. - person Logan R. Kearsley; 13.05.2015