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

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

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

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

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

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


person Paul Steckler    schedule 26.02.2015    source источник
comment
Вам нужно прочитать это: stackoverflow.com/questions/24884827/   -  person szatmary    schedule 26.02.2015
comment
Похоже, что единицы NAL, не относящиеся к VCL, накапливаются, а затем объединяются со следующей единицей NAL VCL.   -  person Paul Steckler    schedule 26.02.2015
comment
Я получаю те же результаты, что и MediaExtractor, если я удаляю конечные 0 после каждого блока NAL. За исключением того, что я получаю 2 или 3 дополнительных единицы в конце своих данных, которые MediaExtractor не дает. Я не вижу конца потока или типа единицы последовательности, поэтому не знаю, что происходит.   -  person Paul Steckler    schedule 27.02.2015
comment
Конец последовательности является необязательным и очень редко используется (если вообще используется).   -  person szatmary    schedule 27.02.2015


Ответы (1)


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

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

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

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

person Jk Jensen    schedule 02.11.2017