2017-04-25 111 views
1

Android MediaCodec可以用来解码输出yuv420格式。我想它应该是NV12格式,但是当我在Nexus6 7.1.1设备上尝试它时。其结果是非常陌生:android-MediaCodec解码器1080p输出yuv格式

ffplay -v信息-f rawvideo -pixel_format YUV420P -video_size 1280×720:

  1. 720P视频,它工作正常,输出YUV可以通过ffplay下面命令重演out.yuv

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

  2. 对于1080p视频,输出yuv颜色在顶部不正确。 out.yuv文件的大小是3133440,但width * height * 3/2应该是3110400,所以还有23040个字节。 听起来像顶层颜色不正确。

enter image description here

当尝试对其进行解码,以表面上看,它看起来不错。所以我猜问题只来自1080p YUV包。

+0

请勿使用yuv输出,而应使用Image输出。请参阅https://developer.android.com/reference/android/media/MediaCodec.html#getOutputImage(int)。 – beetlej

回答

1

对于1080p,实际解码图像的高度很可能是1920x1088,而不是1920x1080。 (1920x1088加起来大小为3133440.)最底部的8个像素被解码并返回,但你不应该显示它们。

在这种情况下,该字段MediaFormat.KEY_HEIGHT在输出MediaFormat可能是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类,则会处理这些详细信息。

+0

@mstrosjo准确地说,输出是1920x1088和作物底部是1079.如果我喂这样的yuv到编码器,我还应该添加crop-bottom属性,如果没有,这是否意味着编码器会做1920x1088到1920x1080转换? – lucky1928

+0

它实际上并没有定义如何将这些数据传递给编码器 - 官方建议是使用'Surface'或'Image'作为应该处理和处理所有这些输入的输入。实际上,据我所知,就我所记得的那样,在任何设备上,您都不需要为编码高度填充这个填充。不能被16整除的宽度更成问题;在某些设备上它可以很好地处理任何宽度,而其他设备则需要将输入数据宽度填充到16像素。 – mstorsjo