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

时间:2016-08-01 13:11:07

标签: java android video mediacodec

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

enter image description here

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

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

不幸的是,交换保存图像的宽度/高度并没有改变任何东西,图像仍然会被破坏。如何正确处理旋转帧的保存代码?

1 个答案:

答案 0 :(得分:3)

正如source code comment pointed out by another answer暗示的那样,OpenGL需要转换图像。原始invert布尔值有助于未旋转或旋转180度的源。但其他方向(90和270)将显示翻转图像,因此它们也必须翻转。

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

  1. 从源媒体中读取rotation-degrees属性(如果可用)。
  2. 修改CodecOutputSurface构造函数以接受数字旋转参数,该参数存储在mRotation实例变量中。
  3. 修改旋转为0或180时要使用的原始invert代码。
  4. 旋转为90或270时使用不同的矩阵变换。
  5. 您可以从the following gist获取完整修改后的版本,并查看上面提到的individual changes