为什么 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)会显示翻转的图像,所以它们也必须翻转。
以下是我为正确处理旋转所做的更改:
- 从源媒体读取
rotation-degrees
属性(如果可用)。
- 修改
CodecOutputSurface
构造函数以接受存储在 mRotation
实例变量中的数字旋转参数。
- 修改原
invert
旋转0或180时使用的代码
- 当旋转为 90 或 270 时使用不同的矩阵变换。
您可以从上面提到的the following gist as well as take a look at the individual changes获得完整的修改版本。
我开始为一个应用程序制作 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 并没有改变任何东西,图像仍然被损坏。必须对保存代码做些什么才能正确处理旋转帧?
正如 invert
布尔值有助于处理未旋转或旋转 180 度的源。但是其他方向(90和270)会显示翻转的图像,所以它们也必须翻转。
以下是我为正确处理旋转所做的更改:
- 从源媒体读取
rotation-degrees
属性(如果可用)。 - 修改
CodecOutputSurface
构造函数以接受存储在mRotation
实例变量中的数字旋转参数。 - 修改原
invert
旋转0或180时使用的代码 - 当旋转为 90 或 270 时使用不同的矩阵变换。
您可以从上面提到的the following gist as well as take a look at the individual changes获得完整的修改版本。