Я пытаюсь понять, как использовать класс 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? Я играю с множеством идей здесь, и ни одна из них не срабатывает. Любое руководство в этой области будет очень признательно.
Как передать блоки NAL H.264 в Android MediaCodec для декодирования?
Ответы (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
Кроме того, вы можете добавить его в файл
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