Доступ к 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
Основными проблемами будут следующие:
Смоделируйте вход как
MediaSource
,Прочитайте код оболочки, чтобы прочитать буфер из кодека, обработать его и вернуть обратно в кодек.
Для упрощения вы можете посмотреть 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