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

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

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

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

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

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

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

Так что для моих вопросов …

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

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

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

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

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

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

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

Шаш