Доступ к StageFright.so напрямую для декодирования потока H.264 из JNIlayer в Android

Есть ли способ доступа libstagefright.so напрямую декодировать H.264 поток из JNI слой на Android 2.3 или выше?

1 ответ

Решение

Если ваша цель - декодировать элементарно H.264 поток, то ваш код должен убедиться, что поток извлечен, codec-specific-data предоставляется кодеку, который в первую очередь SPS а также PPS данные и данные кадра вместе с метками времени предоставляются кодеку. Через все Android версии, самый распространенный интерфейс будет OMXCodec которая является абстракцией над базовым OMX составная часть.

В Gingerbread (Android 2.3) и ICS (Android 4.0.0), если вы хотите создать декодер, лучшим способом было бы создать OMXCodec компонент и абстрагировать ваш код через MediaSource интерфейс, т.е. ваш код обёртки смоделирован как MediaSource а также OMXCodec читает из этого источника и выполняет декодирование.

Ссылка на Android 2.3 Создание видео декодера: http://androidxref.com/2.3.6/xref/frameworks/base/media/libstagefright/AwesomePlayer.cpp#1094

Ссылка на Android 4.0.0 Создание видео декодера: http://androidxref.com/4.0.4/xref/frameworks/base/media/libstagefright/AwesomePlayer.cpp#1474

Основными проблемами будут следующие:

  1. Смоделируйте вход как MediaSource,

  2. Прочитайте код оболочки, чтобы прочитать буфер из кодека, обработать его и вернуть обратно в кодек.

Для упрощения вы можете посмотреть stagefright исполняемый код командной строки, как в http://androidxref.com/4.0.4/xref/frameworks/base/cmds/stagefright/stagefright.cpp#233

Тем не менее, если ваша программа основана на JellyBean (Android 4.1.x, 4.2.x) и более поздних версиях, то они немного упрощены. Из вашего кода JNI вы можете создать MediaCodec компонент и использовать то же самое для декодирования. Чтобы интегрировать то же самое в вашу программу, вы можете обратиться к SimplePlayer реализация как в http://androidxref.com/4.2.2_r1/xref/frameworks/av/cmds/stagefright/SimplePlayer.cpp#316

Другие вопросы по тегам