返回

Surface 和 GLConsumer 对视频旋转角度的处理:全面指南

Android

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 方法:

  1. 获取视频元数据: 从 MediaCodec 中获取视频元数据的 VideoDecoderOutputFormat,其中包含旋转角度信息。
  2. 创建旋转矩阵: 根据获取的旋转角度创建 4x4 旋转矩阵。
  3. 应用矩阵: 将旋转矩阵应用于 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 时手动处理视频旋转角度,从而确保视频帧在屏幕上正确显示。