Nexus 7 2013 mediacodec视频编码器出现乱码输出

时间:2014-03-22 15:52:28

标签: android encoder mediacodec

我正在使用h.264编码器对图库和其他目标编码电影的应用。此应用程序支持输出的可变宽高比(1:1,2:3,3:2,16:9,3:4,4:3)。我将表面输入用于4.3 API的输入/输出。

该应用程序在许多设备上运行正常(在S3,摩托罗拉G,Nexus 7 2012,摩托罗拉X上测试),然而,在Nexus 7 2013上运行时,我已经碰壁了。

基本上,某些输出分辨率有效,有些则无效。 3:4(720x960),2:3(720x1080)和16:9(1280x720)按预期工作,但其余(1:1(960x960),3:2(1080x720)和4:3(960x720))产生像这样的输出:

http://imageshack.com/a/img811/7984/dtgh.png

我的猜测是在编码器中有一些硬编码的值,它将输入表面视为具有与实际宽度不同的宽度 - 像素线似乎"没有正确排列"。但是,我对导致这种情况以及如何解决这个问题感到茫然。

日志中没有错误,视频编码器编解码器在输出媒体格式时输出正确的表面宽度和高度。

更新:使用360,720或1280宽度编码时似乎没有问题,高度没有影响。我还没有发现1280以下的任何其他宽度都有效。

update2:似乎有更多宽度可用:180,240,640,700。无法找到它们之间的任何相关性。

1 个答案:

答案 0 :(得分:0)

我认为这与设备的芯片组有关。 使用旧的Motorola XT1058时,我遇到完全相同的问题,它使用的是Qualcomm Snapdragon S4 Pro,芯片组与Nexus 7相同。

做一些研究后,我发现另一个答案是,在较旧的Qualcomm设备中,YUV数据需要在2K边界处对齐,但是我不明白如何使用输入表面而不是YUV缓冲区来修复它。

请参阅下一个可接受的答案,以获取有关Qualcomm对齐要求的声明:

How to get stride and Y plane alignment values for MediaCodec encoder

我的解决方法是,对于较旧的设备,我将使用已知的分辨率,这些分辨率可以通过使用CamcorderProfile API查询视频配置文件来获得。

主要问题是如何检测设备是否受到影响,因为MediaCodec API只能提供编解码器名称,而不能给出其版本。