Моя цель - сделать так, чтобы ExoPlayer отображал цветное видео как черно-белое.
Согласно этой этой проблеме Github, я должен добиться этого с помощью Open GL:
ExoPlayer будет рендерить видео на любую поверхность. Вы можете использовать SurfaceTexture, после чего видео будет отображаться в текстуру OpenGL ES. После этого вы можете делать все, что позволяет OpenGL, включая использование пиксельного шейдера для преобразования видео в черно-белое.
В более раннем, но связанном обсуждении в группе Google для разработчиков Android Ромен Гай подробно описывает, как это нужно делать:
- Создать контекст OpenGL
- Сгенерировать имя текстуры OpenGL
- Создайте SurfaceTexture с именем текстуры
- Передайте SurfaceTexture в камеру
- Следите за обновлениями При обновлении SurfaceTexture нарисуйте текстуру с помощью OpenGL, используя нужный шейдер.
Простой :)
Поигравшись с примером проекта Google Cardboard, я определил, что фрагментный шейдер, подобный следующему, должен быть примерно правым:
precision mediump float;
varying vec4 v_Color;
void main() {
float grayscale = v_Color[0] * 0.3 + v_Color[1] * 0.59 + v_Color[2] * 0.11;
gl_FragColor = vec4(grayscale, grayscale, grayscale, 0.1);
}
Мне также удалось сделать рендеринг ExoPlayer в TextureView
вместо обычного SurfaceView
:
mPlayer.sendMessage(
videoRenderer,
MediaCodecVideoTrackRenderer.MSG_SET_SURFACE,
new Surface(mVideoTextureView.getSurfaceTexture())
);
Как все соединить вместе?
Где я могу "применить" шейдер к TextureView
? Это вообще возможно, или мне лучше использовать GLSurfaceView
? Что мне нужно делать в Renderer
?