Как передать блоки NAL H.264 в Android MediaCodec для декодирования?

Я пытаюсь понять, как использовать класс Android MediaCodec для декодирования видео H.264. Для начала я пытаюсь вручную разобрать блоки NAL из файла H.264 и передать их MediaCodec для декодирования. Я считаю, что правильно разбираю блоки NAL из файла (поиск последовательности 0x00 0x00 0x01 в файле указывает на начало блока NAL), но MediaCodec всегда истекает и возвращает -1 каждый раз, когда я делаю вызов dequeueOutputBuffer (). Кто-нибудь знает особенности того, как передавать блоки H.264 NAL в MediaCodec для декодирования? Должен ли я удалить последовательность 0x00 0x00 0x01 перед отправкой блока NAL? Нужно ли игнорировать/отбрасывать определенные типы блоков NAL? Нужно ли добавлять извлеченную информацию SPS и PPS (с последовательностью 0x00 0x00 0x01 или без нее) перед каждым блоком NAL? Я играю с множеством идей здесь, и ни одна из них не срабатывает. Любое руководство в этой области будет очень признательно.


person unbrokenrabbit    schedule 08.03.2013    source источник


Ответы (2)


Насколько я знаю, декодер будет возвращать -1 в dequeueOutputBuffer() до тех пор, пока вы не передадите ему информацию sps/pps. Когда вы это сделаете, декодер должен вернуться с флагом INFO_OUTPUT_FORMAT_CHANGED (-2) в dequeueOutputBuffer(), и после этого будет корректно возвращать декодированные кадры.

Если декодер по-прежнему возвращает -1, попробуйте добавить информацию sps/pps в декодер с флагом BUFFER_FLAG_CODEC_CONFIG.

person Robert Ende    schedule 26.07.2013
comment
Кроме того, вы можете добавить его в файл MediaFormat. Примеры обоих подходов можно увидеть в CTS EncodeDecodeTest. См. строки 567 и 855 в android.googlesource.com/platform/cts/+/jb-mr2-release/tests/ - person fadden; 27.07.2013

Насколько я знаю, вам нужно вынуть заголовок, а также передать его с помощью SPS/PSS в качестве первых буферов, но получение -1 не имеет большого значения, это будет нормальное поведение. Некоторые устройства будут аварийно завершать работу, если они не получат питание от SPS/PPS до других NAL.

person Hamed    schedule 30.07.2014