Как использовать аппаратное ускорение декодирования видео на Android?

Мне нужно декодирование H.264 с аппаратным ускорением для исследовательского проекта, чтобы протестировать самоопределяемый протокол.

Поскольку у меня есть поиск в Интернете, я нашел несколько способов выполнить декодирование видео с аппаратным ускорением на Android.

  1. Используйте ffmpeg libstagefright (обзор libstagefright) или используйте libstagefright непосредственно в ОС, например здесь .
  2. Используйте OpenMax на определенной аппаратной платформе. как здесь об устройстве Samsung и здесь о серии Qualcomm Snapdragon
  3. Некоторые упомянули PVplayer,

Некоторые люди "говорят", что libstagefright - единственный способ, в то время как ребята из Qualcomm явно добился успеха.

В настоящее время я не уверен, какой способ может работать. Я немного смущен сейчас. Если бы все могло работать, я бы, конечно, предпочел аппаратно-независимый метод.

Поскольку я протестировал несколько видеоплееров с ускорением H/W с помощью Galaxy Tab 7.7 (3.2 и Enxyos), VLC, Mobo, Rock, vplayer, rock и mobo работают нормально, VLC не работает, vplayer, кажется, имеет рендеринг баг, который стоит своей производительности.

Во всяком случае, я сделал «операцию» на Rockplayer и удалил все его библиотеки .so в data\data\com.redirecting\rockplayer, и программное декодирование дает сбой, в то время как аппаратное декодирование работает по-прежнему нормально! Интересно, как они это сделали. Мне кажется, что аппаратное ускорение может не зависеть от аппаратных платформ.

Может ли кто-нибудь решить эту проблему? Или предоставить любую ссылку с дополнительной информацией или более подробной информацией?


person Glenn Yu    schedule 04.07.2012    source источник
comment
Я немного запутался! Вы хотите получить прямой доступ (без мультимедийных API Android) к аппаратно-ускоренному декодеру для декодирования ваших битовых потоков? Потому что все современные SOC для телефонов декодируют H.264 с помощью аппаратного ускорения.   -  person Oak Bytes    schedule 05.07.2012
comment
@OakBytes, я хочу внедрить ускоренное декодирование H/W, однако это уже сделано. Теперь я знаю только, как декодировать поток с помощью программного декодирования ffmpeg. H/W ускорение относится к уровню производительности при 1080P@30fps, в то время как программное декодирование намного слабее. Я избегал называть программное декодирование использованием ЦП, потому что модуль аппаратного ускорения также является частью ЦП. Что вы подразумеваете под всеми современными телефонами, которые уже используют H/W ускорение?   -  person Glenn Yu    schedule 07.07.2012
comment
Когда Gallery Media Player используется для воспроизведения клипов H.264, все последние телефоны Android используют H/W-ускоренный декодер H.264. Я предполагаю, что вы планируете использовать декодер H.264 для декодирования необработанного битового потока H.264 и получения декодированного вывода, а не воспроизводить файл, содержащий видео H.264 и немного аудио.   -  person Oak Bytes    schedule 07.07.2012
comment
@OakBytes Вы правы. Это именно то, что я хотел. Только необработанные битовые потоки и никаких контейнеров mkv или mp4. Извините, я не сделал это яснее. Я хочу вызвать декодирование H/W на основе NAL или уровня кадра по необработанному битовому потоку, а не настраивать медиаплеер для файлов.   -  person Glenn Yu    schedule 07.07.2012
comment
@Holyglenn - ты преуспел в своем проекте? Может быть, вы нашли какую-то новую информацию по теме?   -  person HitOdessit    schedule 17.09.2012
comment
libstagefright мертв в ffmpeg stackoverflow.com/questions/9832503/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 22.02.2016


Ответы (3)


Чтобы ответить на поставленный выше вопрос, позвольте мне представить несколько концепций, связанных с Android.

OpenMAX Android использует OpenMAX для интерфейса кодека. Следовательно, все родные кодеки (с аппаратным ускорением или иным образом) предоставляют интерфейс OpenMAX. Этот интерфейс используется StageFright (инфраструктура проигрывателя) для декодирования мультимедиа с использованием кодека.

NDK Android позволяет Java-приложениям взаимодействовать с базовыми собственными библиотеками C/C++ с помощью NDK. Для этого требуется использование JNI (собственный интерфейс Java).

Теперь перейдем к вашему вопросу How to tap native decoder to decode raw video bitstream?

В версии Android 4.0 и ниже Android не предоставлял доступ к базовым видеодекодерам на уровне Java. Вам нужно будет написать собственный код для прямого взаимодействия с декодером OMX. Хотя это возможно, это не тривиально, поскольку для этого потребуется знание того, как работает OMX и как сопоставить этот OMX с приложением с помощью NDK.

В версии 4.1 (версия Jelly Bean) Android, по-видимому, предоставляет доступ к декодерам с аппаратным ускорением на уровне приложений через JAVA API. Дополнительные сведения о новых API см. на странице http://developer.android.com/about/versions/android-4.1.html#Multimedia

person Oak Bytes    schedule 07.07.2012
comment
Спасибо за разъяснение концепций и ответов. Я просмотрел ссылки только для того, чтобы найти слишком верное, что я должен копаться в структуре ОС. Это определенно сработает. - person Glenn Yu; 08.07.2012
comment
Однако, как показывает операция на Rockplayer, в которой я удалил все библиотеки .so, а аппаратное декодирование все еще работает, в то время как программное декодирование дает сбой, в версии Android 4.0 и ниже может быть более простой способ. Что касается моего необработанного декодирования битового потока и всего остального, мне, возможно, придется разобраться во всем, что касается OMX. Можете ли вы дать Java API в Jelly Bean? - person Glenn Yu; 08.07.2012
comment
@Holygenn Я добавил ссылку на API-интерфейсы медиаплеера в Jelly Bean. В случае с RockPlayer, он напрямую отображает видео с помощью декодеров с аппаратным ускорением или предоставляет вам выходные буферы? Легче сделать первое, чем второе, с помощью декодеров с аппаратным ускорением. - person Oak Bytes; 08.07.2012
comment
RockPlayer имеет закрытый исходный код, открыта только конфигурация ffmpeg, поэтому я не уверен, что он использовал. Я предполагаю, что в Rockplayer после демультиплексирования необработанное видео подается на коммутатор, позволяя пользователю выбирать между декодером стороннего производителя sw или системным декодером hw, как предлагается в меню, а затем обрабатывается и отображается. Я проводил эксперимент с Rockplayer под Honeycomb 3.2. Таким образом, кажется, что есть способ использовать системные кодеки без NDK/JNI, не говоря о том, что NDK слишком хлопотно, но исследуя возможность. - person Glenn Yu; 08.07.2012
comment
Насколько я понимаю, Jelly bean MediaCodec предоставляет системные кодеки (SW/HW) для необработанного битового потока. Кажется, это именно то, что мне нужно - мне нужно декодировать (с помощью hw) и отображать необработанный видеопоток. Однако по мере того, как этим движет любопытство, мне еще больше не терпится узнать, как я могу добиться аппаратно-ускоренного декодирования без Jelly Bean. Большое спасибо за вашу помощь до сих пор. - person Glenn Yu; 08.07.2012

Используйте ExoPlayer (github).

Это спонсируемый Google проект с открытым исходным кодом, который заменяет MediaPlayer платформы. Каждый компонент в конвейере является расширяемым, включая образец источника (как кадры H.264 извлекаются из вашего пользовательского протокола) для рендеринга (в Surface, SurfaceTexture и т. д.).

Он включает в себя прекрасную демонстрацию. приложение, показывающее использование.

person Peter Tran    schedule 11.05.2016

Вы можете попробовать MediaExtractor и MediaCodec (они также доступны в NDK — AMediaExtractor и AMediaCodec — см. пример воспроизведения .mp4 здесь native-codec)

person GregoryK    schedule 13.03.2017