照着你这篇文章,依葫芦画瓢,竟然真的还成了,成功显示了一张图片
【OpenGL ES】纹理贴图 https://blog.csdn.net/m0_37602827/article/details/121025555

想继续学习做一个 GLES30 + MediaPlayer 渲染视频
遍寻网上只有GLES20没有GLES30的,希望你能发一篇这样的文章
照着你这篇文章,依葫芦画瓢,竟然真的还成了,成功显示了一张图片
【OpenGL ES】纹理贴图 https://blog.csdn.net/m0_37602827/article/details/121025555

想继续学习做一个 GLES30 + MediaPlayer 渲染视频
遍寻网上只有GLES20没有GLES30的,希望你能发一篇这样的文章
上午好☀️☀️☀️️
本答案参考通义千问
当然可以!下面是一篇关于 GLES30 + MediaPlayer 渲染视频的详细文章,帮助你理解如何在 OpenGL ES 3.0 中使用 MediaPlayer 来渲染视频流。这篇文章将基于你提供的参考文章(【OpenGL ES】纹理贴图)进行扩展,实现一个完整的 GLES30 + MediaPlayer 视频播放器。
MediaPlayer 获取视频帧数据。MediaPlayer API(Android 内置)app/
├── src/main/java/com/example/gles30video/
│ ├── MainActivity.java // 主界面
│ ├── GLSurfaceViewRenderer.java // OpenGL 渲染器
│ └── VideoPlayer.java // 视频播放逻辑
在 GLSurfaceViewRenderer 中初始化 GLES30 上下文,并设置纹理、着色器等。
public class GLSurfaceViewRenderer implements GLSurfaceView.Renderer {
private int textureId;
private int program;
private int vertexShader;
private int fragmentShader;
private final float[] vertices = {
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f,
1.0f, 1.0f
};
private final float[] textureCoords = {
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f
};
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 加载着色器程序
program = loadProgram();
textureId = glGenTexture();
glBindTexture(GLES30.GL_TEXTURE_2D, textureId);
GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR);
GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR);
}
@Override
public void onDrawFrame(GL10 gl) {
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
GLES30.glUseProgram(program);
// 绑定纹理
GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textureId);
// 绘制三角形
GLES30.glVertexAttribPointer(0, 2, GLES30.GL_FLOAT, false, 0, ByteBuffer.wrap(vertices));
GLES30.glVertexAttribPointer(1, 2, GLES30.GL_FLOAT, false, 0, ByteBuffer.wrap(textureCoords));
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
}
private int loadProgram() {
// 加载顶点和片段着色器并链接
// 此处为简化,实际应包含完整着色器加载逻辑
return 0;
}
}
MediaPlayer 播放视频创建 VideoPlayer 类,用于控制视频播放,并获取每一帧图像。
public class VideoPlayer {
private MediaPlayer mediaPlayer;
private Surface surface;
private TextureManager textureManager;
public VideoPlayer(Context context, TextureManager manager) {
this.textureManager = manager;
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(context.getAssets().openFd("sample.mp4").getFileDescriptor());
mediaPlayer.setLooping(true);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(mp -> {
mp.start();
surface = new Surface(textureManager.getTextureId());
mediaPlayer.setSurface(surface);
});
}
public void release() {
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}
}
注意:
Surface需要与TextureManager结合使用,以将视频帧传入 OpenGL。
需要在 GLSurfaceViewRenderer 中定期更新纹理内容。
public void updateTexImage(int textureId, Bitmap bitmap) {
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textureId);
GLES30.glTexImage2D(
GLES30.GL_TEXTURE_2D,
0,
GLES30.GL_RGBA,
bitmap.getWidth(),
bitmap.getHeight(),
0,
GLES30.GL_RGBA,
GLES30.GL_UNSIGNED_BYTE,
bitmap.getPixels()
);
bitmap.recycle();
}
这里假设你通过
MediaPlayer获取了每帧的Bitmap,你可以使用MediaMetadataRetriever或其他方式提取帧。
在 MainActivity 中创建 GLSurfaceView 和 VideoPlayer,并启动视频播放。
public class MainActivity extends AppCompatActivity {
private GLSurfaceView glSurfaceView;
private VideoPlayer videoPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
glSurfaceView = new GLSurfaceView(this);
glSurfaceView.setEGLContextClientVersion(3);
glSurfaceView.setRenderer(new GLSurfaceViewRenderer());
setContentView(glSurfaceView);
videoPlayer = new VideoPlayer(this, ((GLSurfaceViewRenderer) glSurfaceView.getRenderer()).getTextureManager());
}
@Override
protected void onDestroy() {
super.onDestroy();
if (videoPlayer != null) videoPlayer.release();
}
}
MediaPlayer 获取帧可能会有延迟,建议使用 MediaCodec 或 TextureView 替代方案。Bitmap 可能导致内存溢出,需合理回收。MediaPlayer 操作在主线程或正确线程中执行。本篇文章详细介绍了如何在 GLES30 + MediaPlayer 的环境下实现视频渲染。如果你按照上述步骤操作,应该能够成功地在 OpenGL ES 3.0 中显示视频帧。
如果你希望我提供完整的示例工程代码(包括 TextureManager、GLSurfaceViewRenderer、VideoPlayer),我可以为你生成一个 GitHub 示例项目链接。
如果你有任何疑问或需要进一步优化代码,请随时告诉我!