Видеоплеер для Android с использованием NDK, OpenGL ES и FFmpeg - PullRequest
28 голосов
/ 13 января 2011

Хорошо, вот что у меня есть.Я построил FFmpeg на Android и могу использовать его нормально.Я смог загрузить видео в FFmpeg после передачи выбранного имени файла со стороны Java.Чтобы сэкономить на производительности, я пишу видеоплеер в NDK, а не передаю кадры из FFmpeg в java через JNI.Я хочу отправить кадры из видео на поверхность OpenGL.У меня возникают проблемы с выяснением, как получить каждый кадр видео и визуализировать его на поверхность OpenGL.Я застрял, пытаясь выяснить это в течение пары недель без удачи.Надеюсь, кто-то может указать мне правильное направление.

Спасибо!

1 Ответ

21 голосов
/ 13 января 2011

Один способ, который приходит на ум, - это нарисовать пиксели вашего фрейма в текстуру, а затем визуализировать эту текстуру, используя OpenGL.

Некоторое время назад я написал сообщение в блоге о том, как это сделать, прежде всегодля старых пиксельных видеоигр, но это также относится и к вашей ситуации.Это сообщение Собственное кодирование Android на C , и я установил github-репозиторий с примером .Используя эту технику, я смог получить 60 FPS даже на оборудовании первого поколения.

РЕДАКТИРОВАТЬ относительно glTexImage2D против glTexSubImage2D для этого подхода.

Вызов glTexImage2D выделит видеопамяти для вашей текстуры и скопируйте пиксели, которые вы передаете в эту память (если вы не передаете NULL).Вызов glTexSubImage2D обновит пиксели, которые вы указали в уже выделенной текстуре.

Если вы обновите все текстуры, то есть небольшая разница, вызывая одну или другую, фактически glTexImage2D обычно быстрее,Но если вы обновляете только часть текстуры, glTexSubImage2D выигрывает по скорости.

Вы должны использовать размеры текстур степени 2, поэтому при покрытии экрана на устройствах высокого разрешения требуется текстура 1024x512 и512x512 текстур на средних разрешениях.Текстура больше, чем область экрана (высокое разрешение 800x400), что означает, что вам нужно обновить только ее часть, так что glTexSubImage2D - это то, что нужно.

...