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

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

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

Вот что у меня так далеко:

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

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

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

Так что за мои вопросы...

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

1 ответ

Решение

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

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

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

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

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

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

Шаш

Другие вопросы по тегам