android - MediaCodec解码器1080p输出yuv格式

android - MediaCodec decoder 1080p output yuv format

Android MediaCodec可用于解码输出yuv420格式。我猜它应该是 NV12 格式,但是当我在 Nexus6 7.1.1 设备上尝试它时。结果很奇怪:

  1. 对于 720p 视频,它工作正常,输出的 yuv 可以通过 ffplay 使用以下命令播放:

    ffplay -v info -f rawvideo -pixel_format yuv420p -video_size 1280x720 out.yuv

    而out.yuv文件大小正好是宽*高*3/2。

  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 起可用),这些细节将得到处理。