2012-07-04 5 views
29

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

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

  1. Использование FFmpeg libstagefright (overview of libstagefright) или использовать libstagefright в ОС непосредственно, как here.
  2. Используйте OpenMax на конкретной аппаратной платформе. как here about samsung device и here about Qualcomm Snapdragon series
  3. Некоторые люди сказали PVplayer,

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

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

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

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

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

+0

Я немного запутался! Вы хотите, чтобы прямой доступ (без API-интерфейсов для Android) к ускоренному декодеру H/W для декодирования ваших битовых потоков? Потому что все современные SOC SOC декодируют H.264, используя H/W Acceleration. –

+0

@ OakBytes, я хочу реализовать ускоренное декодирование H/W, однако это сделано. Теперь я знаю, как декодировать поток с расширением программного обеспечения ffmpeg. H/W ускорение относится к уровню производительности при 1080P при 30fps, тогда как декодирование программного обеспечения намного слабее. Я избегал ссылаться на декодирование программного обеспечения как на использование CPU, потому что модуль ускорения H/W также является частью ЦП. Что вы подразумеваете под всеми современными телефонами, использующими ускорение H/W? –

+0

Когда Media Media Player используется для воспроизведения клипов H.264, на всех последних телефонах Android используется ускоренный H.264 декодер H/W. Думаю, вы планируете использовать декодер H.264 для декодирования исходного потока данных H.264 и получения декодированного вывода, а не для воспроизведения файла, содержащего видео H.264 и некоторый звук. –

ответ

22

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

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

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

Сейчас подходит к вашему вопросу How to tap native decoder to decode raw video bitstream?

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

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

+0

Благодарим вас за разъяснения в отношении понятий и ответов. Я просмотрел ссылки только для того, чтобы найти это слишком правдоподобным, что я должен заглянуть в рамки ОС. Это определенно сработает. –

+0

Однако, как предполагает операция на Rockplayer, в которой я удалил все библиотеки .so, и аппаратное декодирование по-прежнему работает, пока программное обеспечение не работает, в версии 4.0 для Android 4.0 может быть несколько более простой способ. Что касается моего необработанного декодирования битового потока и всего, мне, возможно, придется разобраться во всей OMX. Можете ли вы дать Java API в Jelly Bean? –

+0

@Holygenn Я добавил ссылку на API Media Player в Jelly Bean. В случае с RockPlayer, он напрямую отображает видео с помощью аппаратных ускоренных декодеров или предоставляет вам выходные буферы? Легче сделать первый, чем последний, с аппаратно ускоренными декодерами. –

0

Использование ExoPlayer (github).

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

Включает в себя красивый demo app showing usage.

0

Вы могли бы хотеть попробовать MediaExtractor и MediaCodec (Они также доступны в НДК - AMediaExtractor и AMediaCodec - см образец для воспроизведения .mp4 здесь native-codec)

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