Запись поверхности с использованием MediaCodec

Итак, в моем приложении я могу показать эффекты (например, фильтр размытия, гауссовский) для видео, которое приходит из камеры, используя GPUImage.

В принципе, я (библиотека) будет принимать данные от камеры, получать необработанные байтовые данные, преобразовывать их в формат RGBA из формата YUV, а затем применять эффекты к этому изображению и отображать на Surface of GLSurfaceView, используя OpenGL. наконец, для пользователя, это похоже на видео с эффектами.

Теперь я хочу записать кадры Surface в качестве видео, используя MediaCodec API.

но этот обсуждение говорит, что мы не можем передать предопределенный Surface в MediaCodec.

Я видел несколько примеров в bigflake, где он создает Surface с помощью MediaCodec.createInputSurface(), но для меня Surface происходит от GLSurfaceView.

Итак, как я могу записать кадры Surface в качестве видео?

Я буду записывать аудио параллельно, объединять это видео и аудио с помощью FFMPEG и представлять пользователю как видео с эффектами.

Ответ 1

Вы можете увидеть полный пример этого в Grafika.

В частности, активность "Показывать + захват камеры" записывает вывод камеры в .mp4. Он также демонстрирует применение некоторых простых методов обработки изображений в GL-шейдере. Он использует GLSurfaceView и свернутый танец, чтобы сохранить запись в процессе изменения ориентации.

Также, возможно, интересный, "Record GL app with FBO" ведет записи активности OpenGL ES, представляя пару разных способов. Он использует простой SurfaceView и гораздо более простой.