我的目标是让ExoPlayer将彩色视频显示为黑白色。
根据这个this Github issue,我应该能够通过Open GL实现这一目标:
ExoPlayer会将视频渲染到任何Surface。你可以用 SurfaceTexture,此时你将视频渲染成一个 OpenGL ES纹理。一旦你有了,你可以做任何OpenGL 让你这样做,包括使用像素着色器将视频转换为 黑与白。
在an older, but related, discussion in the Android Developers Google group中,Romain Guy提供了一些有关如何完成此操作的详细信息:
- 创建OpenGL上下文
- 生成OpenGL纹理名称
- 使用纹理名称
创建SurfaceTexture- 将SurfaceTexture传递给相机
- 监听更新在SurfaceTexture更新中,使用绘制纹理 使用你想要的着色器的OpenGL
简单:)
通过玩Google's Cardboard example project,我已经确定像下面这样的片段着色器应该是正确的:
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
?
答案 0 :(得分:1)
我之前已经将片段着色器应用于由ExoPlayer播放的视频。最有效的方法似乎是将视频播放到GLSurfaceView
,因为它们对自定义渲染器有很好的支持。
可以从here获得将{0}应用于OpenGL着色器的工作示例。它甚至已经将灰度片段着色器作为其effects library的一部分。现有代码需要进行一些小的重构,因为它使用GLSurfaceView
而不是MediaPlayer
。