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

Why does ExtractMpegFramesTest not work with rotated input files?

我开始为一个应用程序制作 decode/encode 视频,似乎 BigFlake's site is the authoritative reference for working video code. I've copied the ExtractMpegFramesTest_egl14.java 进入我的项目并修改它以使用不同的文件路径,但没有别的。它从我复制到设备中的预录视频中正确提取帧。但是,当尝试将它与从设备相机录制的视频一起使用时,我得到的帧只是水平线:

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

int rotation = format.getInteger("rotation-degrees");

不幸的是,交换已保存图像的 width/height 并没有改变任何东西,图像仍然被损坏。必须对保存代码做些什么才能正确处理旋转帧?

正如 所暗示的,OpenGL 需要转换图像。原始 invert 布尔值有助于处理未旋转或旋转 180 度的源。但是其他方向(90和270)会显示翻转的图像,所以它们也必须翻转。

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

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

您可以从上面提到的the following gist as well as take a look at the individual changes获得完整的修改版本。