android - MediaCodec解码器1080p输出yuv格式
android - MediaCodec decoder 1080p output yuv format
Android MediaCodec可用于解码输出yuv420格式。我猜它应该是 NV12 格式,但是当我在 Nexus6 7.1.1 设备上尝试它时。结果很奇怪:
对于 720p 视频,它工作正常,输出的 yuv 可以通过 ffplay 使用以下命令播放:
ffplay -v info -f rawvideo -pixel_format yuv420p -video_size 1280x720 out.yuv
而out.yuv文件大小正好是宽*高*3/2。
对于 1080p 视频,输出的 yuv 颜色在顶部不正确。 out.yuv 文件大小为 3133440,但宽度*高度*3/2 应为 3110400,因此还有 23040 字节。
听起来顶层颜色不正确。
当尝试将其解码到表面时,它看起来不错。所以我猜问题只来自 1080p YUV 包。
对于1080p,很有可能实际解码后的画面高度是1920x1088,而不是1920x1080。 (1920x1088 加起来大小为 3133440。)最底部的 8 个像素被解码并返回,但你不应该显示它们。
在这种情况下,输出 MediaFormat
中的 MediaFormat.KEY_HEIGHT
字段可能是 1088,而 crop-top
字段是 0,而 crop-bottom
是 1079。参见 https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java#976 有关如何读取这些字段的示例。
正如 beetlej 所建议的,如果您使用 Image
class received from the MediaCodec.getOutputImage
方法(自 Android 5.0 起可用),这些细节将得到处理。
Android MediaCodec可用于解码输出yuv420格式。我猜它应该是 NV12 格式,但是当我在 Nexus6 7.1.1 设备上尝试它时。结果很奇怪:
对于 720p 视频,它工作正常,输出的 yuv 可以通过 ffplay 使用以下命令播放:
ffplay -v info -f rawvideo -pixel_format yuv420p -video_size 1280x720 out.yuv
而out.yuv文件大小正好是宽*高*3/2。
对于 1080p 视频,输出的 yuv 颜色在顶部不正确。 out.yuv 文件大小为 3133440,但宽度*高度*3/2 应为 3110400,因此还有 23040 字节。 听起来顶层颜色不正确。
当尝试将其解码到表面时,它看起来不错。所以我猜问题只来自 1080p YUV 包。
对于1080p,很有可能实际解码后的画面高度是1920x1088,而不是1920x1080。 (1920x1088 加起来大小为 3133440。)最底部的 8 个像素被解码并返回,但你不应该显示它们。
在这种情况下,输出 MediaFormat
中的 MediaFormat.KEY_HEIGHT
字段可能是 1088,而 crop-top
字段是 0,而 crop-bottom
是 1079。参见 https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java#976 有关如何读取这些字段的示例。
正如 beetlej 所建议的,如果您使用 Image
class received from the MediaCodec.getOutputImage
方法(自 Android 5.0 起可用),这些细节将得到处理。