Декодирование и рендеринг видео на Android - PullRequest
4 голосов
/ 21 июля 2011

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

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

Вот что у меня есть:

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

Так что теперь мои проблемы

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

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

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

1 Ответ

2 голосов
/ 29 июля 2011

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

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

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

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

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

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

Шаш

...