Nexus 7 2013媒体编解码器视频编码器输出乱码

3
我正在开发一个应用程序,使用h.264编码器将电影编码为画廊和其他目标。该应用程序支持输出可变宽高比(1:1、2:3、3:2、16:9、3:4、4:3)。我正在使用4.3 API的表面输入进行输入/输出。
该应用程序在许多设备上运行良好(在S3、Motorola G、Nexus 7 2012、Motorola X上测试过),但是在Nexus 7 2013上运行时遇到了问题。
基本上,某些输出分辨率可以正常工作,而有些则不行。1:1(960x960)、3:2(1080x720)和4:3(960x720)的输出会产生这样的结果:

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

我的猜测是编码器中有一些硬编码的值,将其输入表面视为实际宽度不同-像素行似乎“未正确对齐”。然而,我不知道会导致这种情况以及如何解决它。日志中没有错误,并且视频编码器编解码器在输出媒体格式时记录了正确的表面宽度和高度。更新:似乎使用360、720或1280宽度进行编码时没有问题,高度没有影响。我没有找到其他低于1280的宽度。更新2:似乎还有更多可用的宽度:180、240、640、700。我没有找到它们之间的任何相关性。

听起来像是步幅不匹配的问题。通常,如果宽度和高度是16的倍数,你就很安全了(还有一个1080的额外容差),但你可能会发现一些例外情况。 - fadden
谢谢回复。我尝试将宽度/高度转换为16和32的倍数,因为我之前看到过这样的建议,但是它没有起作用。所有列出的不起作用的分辨率都是16的倍数。可能是制造商的错误吧。 - user3449998
我在2013年的Nexus 7上也遇到了同样的问题。它适用于许多分辨率(即任何宽屏分辨率,如1080p、720p等)。它还适用于一些其他随机分辨率,但我还没有找到它喜欢哪些分辨率的模式。如果我学到了其他东西,我会回复这个帖子。由于这篇文章相当古老,您可能已经解决了这个问题。 - Jim
没有,我没有修复它,而是通过一个硬编码的宽度列表来解决了这个问题(宽度是唯一重要的因素),并且四舍五入到最接近的一个。 - user3449998
1个回答

0

我相信这与设备的芯片组有关。 我遇到了与旧的摩托罗拉XT1058相同的问题,它使用高通骁龙S4 Pro芯片组,与Nexus 7相同。

通过另一个答案的研究,我发现在旧的高通设备中,YUV数据需要在2K边界处对齐,但是当使用输入表面而不是YUV缓冲区时,我无法理解如何修复它。

请参见下一个被接受的答案,了解有关高通对齐要求的声明:

如何获取MediaCodec编码器的步幅和Y平面对齐值

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接