2013-03-08 3 views
7

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

ответ

4

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

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

+1

В качестве альтернативы вы можете добавить его в «MediaFormat». Примеры обоих подходов можно увидеть в CTS EncodeDecodeTest. См. Строки 567 и 855 в https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java – fadden

0

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

Смежные вопросы