декодировать ошибки необработанного потока H.264 на Android

Когда я пытаюсь декодировать необработанный поток H.264 с помощью MediaCodec на Note3 (N9005, Android 4.3), я получаю следующие ошибки:

12-25 19:57:40.362: E/ACodec(19827): [OMX.qcom.video.decoder.avc] ERROR(0x80001009)
12-25 19:57:40.362: E/MediaCodec(19827): Codec reported an error. (omx error 0x80001009, internalError -2147483648)
12-25 19:57:40.362: W/System.err(19827): java.lang.IllegalStateException
12-25 19:57:40.362: W/System.err(19827): at android.media.MediaCodec.dequeueInputBuffer(Native Method)

Но те же коды работают на Note3 (N900) и Google Nexus 7 (2-го поколения). Вот код, на который я ссылался: http://developer.android.com/reference/android/media/MediaCodec.html PS: заголовок моего необработанного потока H.264 выглядит так:

---------------------------------------------------------------------------------------
|00 00 00 01 67 ... 00 00 00 01 68 ...00 00 00 01 65(tatol 4 slices )...00 00 00 01 61|
---------------------------------------------------------------------------------------

При необходимости могу прикрепить видеофайл с моим тестом.


person hopetribe    schedule 26.12.2013    source источник
comment
Каков источник закодированного видео? Он был создан с помощью MediaCodec? FWIW, различные примеры можно найти на bigflake.com/mediacodec (включая некоторые тесты CTS, которые работают с H. 264 потока).   -  person fadden    schedule 26.12.2013
comment
Видео было создано другим кодировщиком. часть Mediacodec в порядке, работает на Samsung Galaxy Note3 (N900), Samsung Note5110 и Nexus 7, кроме N9005   -  person hopetribe    schedule 26.12.2013
comment
Наконец-то проблема была решена. Я изменил codec.queueInputBuffer(inIndex, 0, size, 0, MediaCodec.BUFFER_FLAG_CODEC_CONFIG) на codec.queueInputBuffer(inIndex, 0, size, 0, 0), сбой исчез, решено! Но я все еще не понимаю, почему? Кто-нибудь может это объяснить? Спасибо.   -  person hopetribe    schedule 27.12.2013
comment
Вы не включили свой код в вопрос, поэтому трудно сказать. Я могу сказать, что флаг CODEC_CONFIG должен быть указан только для буфера, содержащего данные CSD (SPS/PPS), и что если вы включаете CSD как часть MediaFormat, то вы должны просто полностью удалить этот буфер. Поведение кодеков MediaCodec плохо определено; в то время как есть тест CTS, который проверяет оба хороших пути (CSD в формате, CSD в буфере), нет ни одного, который предписывает конкретное поведение для плохих путей (CSD дважды, без CSD), поэтому поведение в этих случаях не определено.   -  person fadden    schedule 27.12.2013


Ответы (1)


MediaCodec вызывает OpenMax(OMX) для декодирования видеопотока. Это зависит от конкретной системы, поэтому не очень хорошо работает на любом устройстве. Вы можете протестировать этот пример в Github и Аппаратное декодирование Android с помощью MediaCodec может помочь

person Hanson.tian    schedule 26.12.2013
comment
Я тоже это пробовал. На N9005 не работает. Спасибо, в любом случае, - person hopetribe; 26.12.2013