Декодирование и рендеринг видео на Android

Что мне нужно сделать, так это декодировать видеокадры и визуализировать кадры на трапециевидной поверхности. Я использую Android 2.2 в качестве платформы для разработки.

Я не использую службу медиаплеера, так как мне нужен доступ к декодированным кадрам.

Вот что у меня есть до сих пор:

  • Я использую фреймворк stagefright для извлечения декодированных видеокадров.
  • затем каждый кадр преобразуется из формата YUV420 в формат RGB.
  • преобразованные кадры затем копируются в текстуру и визуализируются на поверхности OpenGL.
  • Обратите внимание, что я использую Processing, а не вызовы OpenGL напрямую.

Итак, теперь мои проблемы

  • я могу декодировать файлы mp4 только с помощью stagefright
  • рендеринг слишком медленный, около 100 мс для кадра 320x420
  • звука пока нет, могу только видео рендерить но пока не знаю как синхронизировать проигрывание аудиокадров.

Итак, на мои вопросы...

  • как я могу поддерживать другие форматы видео? Должен ли я использовать stagefright или мне следует переключиться на ffmpeg?
  • как я могу улучшить производительность? Я должен быть в состоянии поддерживать по крайней мере 720p?
  • Должен ли я использовать вызовы OpenGL напрямую вместо обработки? Улучшит ли это производительность?
  • Как я могу синхронизировать звуковые кадры во время воспроизведения?

person mctma    schedule 21.07.2011    source источник
comment
Android 2.2... на чем? ПК? Планшет? Обновленный винтажный G1?   -  person genpfault    schedule 21.07.2011
comment
это на самом деле на специальном встроенном устройстве, более или менее похожем на планшет. он основан на процессоре Arm Cortex A8. Надеюсь, что это ответ на ваш вопрос   -  person mctma    schedule 22.07.2011


Ответы (1)


Добавление других видеоформатов и кодеков в stagefright

Если у вас есть парсеры для «других» форматов видео, то вам необходимо реализовать плагин для извлечения медиафайлов Stagefright и интегрировать его в awesome player. Точно так же, если у вас есть компоненты OMX для необходимых видеокодеков, вам необходимо интегрировать их в класс OMXCodec. Использование компонентов FFMPEG в stagefright или использование проигрывателя FFMPEG вместо stagefright не кажется тривиальным. Однако, если требуемые форматы уже доступны в Opencore, вы можете изменить стек Android, чтобы Opencore выбирался для этих форматов. Вам нужно перенести логику получения данных YUV в Opencore. (испачкаться с MIO)

Производительность воспроизведения

Поверхностный отражатель, используемый для обычного воспроизведения, использует Overlay для рендеринга. Обычно он обеспечивает около 4-8 видеобуферов (пока что я видел). Таким образом, вы можете проверить, сколько разных буферов вы получаете при рендеринге OPEN GL. Увеличение буфера определенно улучшит производительность. Кроме того, проверьте время, необходимое для преобразования YUV в RGB. Может оптимизировать или использовать библиотеку с открытым исходным кодом для повышения производительности. Обычно Open GL не используется для рендеринга видео (известного как Graphics). Так что не уверен в производительности.

Синхронизация аудио и видео

Время аудио используется в качестве эталона. В Stagefright awesome player использует Audio Player для воспроизведения звука. Этот проигрыватель реализует интерфейс для предоставления данных о времени. Awesome player использует это для рендеринга видео. В основном видеокадры визуализируются, когда время их представления совпадает со временем воспроизводимого аудиосэмпла.

Шаш

person Shash316    schedule 29.07.2011