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

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

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

Use ffmpeg libstagefright (overview of libstagefright) or use libstagefright in the OS directly, like here. Use OpenMax on specific hardware platform. like here about samsung device and here about Qualcomm Snapdragon series Some people mentioned PVplayer,

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

Currently I am not sure which way could work, Я немного смущен сейчас. Если бы все могло работать, я бы предпочел аппаратно-независимый метод.

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

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

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

 HitOdessit17 сент. 2012 г., 10:19
@Holyglenn - вам удалось с вашим проектом? Может быть, вы нашли новую информацию о предмете?
 Glenn Yu07 июл. 2012 г., 09:18
@OakBytes Вы правы. Это именно то, что я хотел. Просто сырые битовые потоки и никаких контейнеров mkv или mp4. Извините, я не прояснил ситуацию. Я хочу вызывать H / W декодирование, основанное на NAL или уровне кадров по сырому потоку битов, а не настраивать медиаплеер для файлов.
 Glenn Yu07 июл. 2012 г., 08:27
@ OakBytes, я хочу реализовать ускоренное декодирование H / W, как бы то ни было. Теперь я знаю только, как декодировать поток с помощью программного декодирования ffmpeg. H / W ускорение относится к уровню производительности при 1080P при 30 кадрах в секунду, в то время как программное декодирование намного слабее. Я избегал ссылаться на программное декодирование как на использование CPU, потому что модуль ускорения H / W также является частью CPU. Что вы подразумеваете под всеми современными телефонами, уже использованными H / W ускорением?
 Oak Bytes07 июл. 2012 г., 09:03
Когда проигрыватель Gallery Media Player используется для воспроизведения клипов H.264, все последние телефоны Android используют H / W-ускоренный декодер H.264. Я предполагаю, что вы планируете использовать декодер H.264 для декодирования необработанного битового потока H.264 и получения декодированного вывода, а не для воспроизведения файла, содержащего видео H.264 и немного аудио.
 Oak Bytes05 июл. 2012 г., 14:38
Я немного смущен! Вы хотите прямой доступ (без медиа-API Android) к H / W ускоренному декодеру для декодирования ваших битовых потоков? Потому что все современные телефонные SOC декодируют H.264, используя H / W Acceleration.

Ответы на вопрос(3)

ExoPlayer (GitHub).

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

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

позвольте мне представить несколько концепций, связанных с 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

 Glenn Yu08 июл. 2012 г., 09:57
Насколько я понимаю, Jelly bean MediaCodec предоставляет системные кодеки (SW / HW) для необработанного потока битов. Кажется, это именно то, что мне нужно - мне нужно декодировать (с помощью hw) и отображать сырой видеопоток. Однако, поскольку любопытство движет им, я еще больше хочу узнать, как я могу добиться ускоренного декодирования HW без Jelly Bean. Большое спасибо за вашу помощь.
 Glenn Yu08 июл. 2012 г., 05:40
Спасибо за ваше разъяснение концепции и ответы. Я просмотрел ссылки только для того, чтобы найти слишком правдивую информацию о том, что я должен копаться в структуре ОС. Это определенно будет работать.
 08 июл. 2012 г., 08:14
@Holygenn Я добавил ссылку на API Media Player в Jelly Bean. В случае RockPlayer, он отображает видео напрямую, используя аппаратно ускоренные декодеры, или предоставляет вам выходные буферы? Первые проще, чем вторые, с аппаратно ускоренными декодерами.
 Glenn Yu08 июл. 2012 г., 05:44
Однако, как показывает операция на Rockplayer, в которой я удалил все библиотеки .so и аппаратное декодирование все еще работает, пока не происходит сбой программного обеспечения, может быть несколько более простой способ сделать это в версии Android 4.0 и ниже. Что касается моего необработанного декодирования битового потока и всего остального, мне, возможно, придется выяснить всю вещь OMX. Можете ли вы дать Java API в Jelly Bean?
 Glenn Yu08 июл. 2012 г., 09:53
RockPlayer закрыт, только конфиг ffmpeg открыт, поэтому я не уверен, какой он использовал. Я предполагаю, что в Rockplayer после демультиплексирования необработанное видео подается в коммутатор, позволяя пользователю выбирать из sw стороннего декодера или системного декодера hw в соответствии с предложенным меню, а затем обрабатывать и отображать. Я провел эксперимент Rockplayer под Honeycomb 3.2. Таким образом, кажется, был бы способ задействовать системные кодеки без NDK / JNI, не говоря, что NDK - это слишком много проблем, но исследуя возможность.

MediaExtractor а такжеMediaCodec (Они также доступны в NDK - AMediaExtractor и AMediaCodec - см. Пример для воспроизведения .mp4 здесьУроженец-кодек)

Ваш ответ на вопрос