我正在使用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。无法找到它们之间的任何相关性。
答案 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只能提供编解码器名称,而不能给出其版本。