Подтвердить что ты не робот

Android-плеер с помощью NDK, OpenGL ES и FFmpeg

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

Спасибо!

4b9b3361

Ответ 1

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

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

EDIT относительно glTexImage2D против glTexSubImage2D для этого подхода.

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

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

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