为什么 ExtractMpegFramesTest 不适用于旋转的输入文件?

Grz*_*icz 4 java video android android-mediacodec

我开始为应用程序解码/编码视频,似乎BigFlake 的网站是工作视频代码的权威参考。我已将ExtractMpegFramesTest_egl14.java复制到我的项目中,并将其修改为使用不同的文件路径,但仅此而已。它从我复制到设备中的预先录制的视频中正确提取帧。然而,当尝试将它与从设备相机录制的视频一起使用时,我得到的帧只是水平线:

在此输入图像描述

在测试了不同录制的视频后,我意识到问题来自旋转视频。该设备的摄像头对来自帧缓冲区的帧进行编码,然后在视频上添加旋转标签。这可以从对象中提取MediaFormat

int rotation = format.getInteger("rotation-degrees");
Run Code Online (Sandbox Code Playgroud)

不幸的是,交换已保存图像的宽度/高度不会改变任何内容,图像仍然会损坏。必须对保存代码执行哪些操作才能正确处理旋转帧?

Grz*_*icz 5

正如另一个答案指出的源代码注释所暗示的那样,OpenGL需要转换图像。原始invert布尔值有助于处理未旋转或旋转 180 度的源。但其他方向(90 和 270)将显示翻转的图像,因此它们也必须翻转。

以下是我为正确处理旋转所做的更改:

  1. rotation-degrees从源媒体读取属性(如果可用)。
  2. 修改CodecOutputSurface构造函数以接受数字旋转参数,该参数存储在mRotation实例变量中。
  3. 修改原来的invert代码,当旋转为0或180时使用。
  4. 当旋转为 90 或 270 时,使用不同的矩阵变换。

您可以从以下要点中获取完整的修改版本,并查看上面提到的各个更改