Как использовать аппаратное ускорение декодирования видео на 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 libs в data \ data \ com.redirecting \ rockplayer, а сбой программного обеспечения упал, а декодирование hw все еще прекрасное! Интересно, как они это сделали. Мне кажется, что hw acclertion может быть независимым от аппаратных платформ.

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

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

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

NDK 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

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

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

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

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