返回
Surface 和 GLConsumer 对视频旋转角度的处理:全面指南
Android
2023-09-29 09:53:44
Surface 和 GLConsumer 对视频旋转角度的处理
Surface 和 GLConsumer 在处理视频旋转角度时具有不同的行为,这可能会对 Android 应用的视频显示产生影响。
Surface
SurfaceView 和 TextureView 都是 Surface 的实现,它充当应用程序与 GPU 之间的接口,用于显示内容。当通过 MediaCodec 解码带有旋转角度的视频时,如果 Output Surface 是 SurfaceView 或 TextureView 提供的,则屏幕上的视频帧可以正常显示,因为它们会自动处理旋转角度。
GLConsumer
另一方面,GLConsumer 是一个由 SurfaceTexture 创建的 Surface,用于在 OpenGL 上下文中显示内容。与 SurfaceView 和 TextureView 不同,GLConsumer 不会自动处理旋转角度。因此,如果 Output Surface 是由 SurfaceTexture 创建的,则屏幕上的视频帧可能无法正确显示,除非手动处理旋转角度。
手动处理旋转角度
要手动处理 GLConsumer 中的旋转角度,需要使用名为 setTransformMatrix
的方法。此方法采用一个 4x4 的浮点矩阵,用于指定旋转角度和缩放比例。
以下步骤说明了如何使用 setTransformMatrix
方法:
- 获取视频元数据: 从 MediaCodec 中获取视频元数据的
VideoDecoderOutputFormat
,其中包含旋转角度信息。 - 创建旋转矩阵: 根据获取的旋转角度创建 4x4 旋转矩阵。
- 应用矩阵: 将旋转矩阵应用于 GLConsumer 的
setTransformMatrix
方法。
代码示例
以下是一个代码示例,演示了如何在 GLConsumer 中手动处理视频旋转角度:
// 获取视频元数据
VideoDecoderOutputFormat format = mediaCodec.getOutputFormat();
// 创建旋转矩阵
float[] transformMatrix = new float[16];
format.getRotationDegrees(); // 获取旋转角度
Matrix.setRotateM(transformMatrix, 0, format.getRotationDegrees(), 0, 0, 1);
// 应用矩阵
surfaceTexture.setTransformMatrix(transformMatrix);
通过遵循这些步骤,可以在使用 GLConsumer 时手动处理视频旋转角度,从而确保视频帧在屏幕上正确显示。