Подтвердить что ты не робот

Извлечение размеров потока H264Video

Я пытаюсь получить размеры (Высота и ширина) из потока H264. Я знаю, что для получения одинаковых деталей из потока mpeg2 вам нужно посмотреть четыре байта после кода запуска заголовка последовательности ((01B3)). Будет ли такая же логика работать для H264? Буду признателен за любую помощь, которую я получаю.

4b9b3361

Ответ 1

НЕТ!!!

Вы должны запустить сложную функцию для извлечения размеров видео из Sequence Parameter Sets. Как это сделать? Ну сначала вы должны написать свой собственный декодер Exp-Golomb или найти один онлайн... в исходном коде live555 где-то есть один, например...

Затем вы должны получить один кадр SPS. Он имеет NAL=0x67 (NAL - первый байт в кадре H.264), и вы можете найти его как кодированную в Base64 строку в SDP под sprop-parameter-sets своей первой строкой Base64 перед первой запятой. В других разделенных запятыми строках есть набор параметров изображения... Это один SPS из SDP Z0KAKYiLQDIBL0IAAB1MAAK/IAg= вам нужно декодировать что-то подобное из Base64 в массив байтов.

Затем вы должны извлечь RAW BYTE SEQUENCE PAYLOAD, за которым следует NAL UNIT HEADER в этом массиве байтов!!! Обычно это один байт, но читайте, чтобы быть уверенным... RBSP содержит байты, необходимые для запуска функции seq_parameter_set_data( ). Таким образом, вам нужно сначала отключить HEADER NAL UNIT HEADER (один или несколько байтов).

Здесь это функция, которая извлекает байты RBSP из SPS NAL UNIT:

NAL UNIT

Затем, когда у вас есть SPS (байты RBSP), вам нужно выполнить функцию, которая анализирует биты в этом массиве байтов. Здесь функция со всеми проанализированными параметрами (весь документ можно найти здесь: http://www.itu.int/rec/T-REC-H.264-201003-I/en и его бесплатно): How to decode SPS

Там вы можете увидеть какой-то странный материал... во-первых, ваши размеры видео рассчитаны следующим образом:

Width = ((pic_width_in_mbs_minus1 +1)*16) - frame_crop_right_offset*2 - frame_crop_left_offset*2;
Height = ((2 - frame_mbs_only_flag)* (pic_height_in_map_units_minus1 +1) * 16) - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2);

Во-вторых, и самое главное, в столбце DESCRIPTOR этой кодовой таблицы указано, что вы должны сделать, чтобы прочитать жирный текстовый параметр в первом столбце. Вот какие значения означают:

  • u (N). Прочитайте беззнаковое число, длина которого составляет N бит.
  • s (N) - прочитайте подписанное число, длина которого составляет N бит
  • ue (v). Прочитайте беззнаковое число Exp-Golomb (v для переменной длины, то же самое, что и ue())
  • se (v) - прочитайте подписанный номер Exp-Golomb

Здесь вам поможет ваш декодер Exp-Golomb...

Итак, реализуем эту функцию, анализируем SPS, и вы получите свою Ширина и Высота. Наслаждайтесь...:)

Ответ 2

Расчеты по размерам ошибочны и должны быть:

width = ((pic_width_in_mbs_minus1 +1)*16) - frame_crop_left_offset*2 - frame_crop_right_offset*2;
height= ((2 - frame_mbs_only_flag)* (pic_height_in_map_units_minus1 +1) * 16) - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2);

Ответ 3

Фактически параметры обрезки должны использоваться только тогда, когда в SPS включена функция [frame_cropping_flag]. Наслаждайтесь H.264!

Ответ 4

Что касается расчета размера кадра, приведенная выше формула неверна.

Когда присутствует chroma_format_idc, мы должны извлечь его из SPS. Если chroma_format_idc нет, то должно быть установлено, что оно равно 1 (формат цветности 4: 2: 0). В этом случае separate_color_plane_flag не задан. Это означает, что chromaArrayType = chroma_format_idc и subWidthC и subHeightC являются uqual для 2.

Переменные cropUnitX и cropUnitY выводятся следующим образом:

  • Если chromaArrayType равно 0, cropUnitX и cropUnitY выводятся как:

    cropUnitX = 1
    cropUnitY = 2 - frame_mbs_only_flag
    
  • В противном случае (chromaArrayType равно 1, 2 или 3), cropUnitX и cropUnitY выводятся как:

    cropUnitX = subWidthC
    cropUnitY = subHeightC * ( 2 - frame_mbs_only_flag )
    

Теперь вы можете использовать cropUnitX и cropUnitY в приведенной выше формуле, чтобы получить правильные значения для размера кадра.