【问题标题】:android - MediaCodec decoder 1080p output yuv formatandroid - MediaCodec 解码器 1080p 输出 yuv 格式
【发布时间】:2017-04-25 17:00:46
【问题描述】:

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,但是width*height*3/2应该是3110400,所以还有23040字节。 听起来顶层颜色不正确。

当尝试将其解码到表面时,它看起来不错。所以我猜问题仅来自 1080p YUV 包。

【问题讨论】:

标签: android android-mediacodec


【解决方案1】:

对于 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 建议的那样,如果您使用从 MediaCodec.getOutputImage 方法(自 Android 5.0 起可用)收到的 Image 类,这些细节将得到处理。

【讨论】:

  • @mstrosjo 确切地说,输出是 1920x1088,crop-bottom 是 1079。如果我将这样的 yuv 提供给编码器,我是否也应该添加crop-bottom 属性,如果没有,这是否意味着编码器会做 1920x1088转换为 1920x1080?
  • 实际上并没有定义如何将这些数据传递给编码器 - 官方建议是使用SurfaceImage 进行输入,它应该负责处理所有这些。在实践中,据我所知,据我所知,您不需要在任何设备上对编码的高度进行此填充。但是,不能被 16 整除的宽度问题更大。在某些设备上,它适用于任何宽度,而其他设备则要求您将输入数据宽度填充到 16 像素。
猜你喜欢
  • 1970-01-01
  • 2014-04-19
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多