Декодирование и рендеринг видео на 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 для воспроизведения аудио. Этот проигрыватель реализует интерфейс для предоставления временных данных. Удивительный плеер использует это для рендеринга видео. В основном, видеокадры воспроизводятся, когда время их представления совпадает со временем воспроизведения аудиосэмпла.
Шаш