Как MediaExtractor анализирует блоки H2AL NAL?

Я пытаюсь понять, как Android MediaExtractor анализирует H264 (содержится в формате контейнера).

Если я исследую поток H264, я вижу, что он состоит из блоков NAL, разграниченных последовательностью 00 00 00 01.

Образцы, возвращаемые MediaExtractor, представляют собой именно те единицы NAL, каждая из которых начинается с этого маркера, за исключением того, что для конкретного источника данных первые три единицы NAL объединяются. Первые два блока NAL очень короткие (29 и 8 байтов).

Почему происходит это объединение? Если бы я мог разобрать H264 вручную, как бы я узнал, как выполнить это объединение?

Для первых трех блоков NAL байт, следующий за префиксом начального кода, составляет 103, 104 и 101 десятичное число. Для большинства следующих блоков NAL это 65, а иногда 101.

1 ответ

На ваш вопрос можно ответить, понимая, как форматируется поток h264.

Android ожидает две единицы конфигурации, называемые набором параметров последовательности (SPS) и набором параметров изображения (PPS) перед любыми кадрами IDR/ не-IDR (обычно называемыми iFrames и pFrames).

Первые два блока NAL объединены просто для удобства. Аппаратный кодек способен определить, являются ли эти кадры уникальными, и настраивается в соответствии со своими значениями. Третий модуль включен, чтобы позволить кодеку начать работать, как только эта конфигурация завершена.

TLDR; Декодирование необработанного потока таким образом вручную не потребует такой структуры. Вместо этого вы просто проанализировали бы каждый блок NAL в отдельности.

Другие вопросы по тегам