5

关于这个主题有一些相关的问题和讨论:

我正在将相机预览帧(NV21转换为NV12)提供给MediaCodec编码器(NV12又名COLOR_FormatYUV420SemiPlanar)。QualComm在一些运行 Android 版本的带有编码器的设备上,4.3我必须进行一些输入帧处理才能接收正确颜色的回帧。

Sony Xperia ZR运行时,Android 4.2.2我必须添加Y平面对齐以使其适用于几乎所有分辨率。上面的代码1024为不能被除的宽度添加了字节对齐,322048为其他分辨率添加了字节对齐。它可以MediaCodec为所有可以划分的分辨率正确编码帧16(除了176x144哪个UV平面看起来未对齐)。

int getYPadding() {
    if (mediaCodecInfo.getName().contains("OMX.qcom") && android.os.Build.VERSION.SDK_INT < 18) {
        if ((getWidth() % 32) != 0) {
            return (getWidth()*getHeight()) % 1024;
        } else {
            return (getWidth()*getHeight()) % 2048;
        }
    }
    return 0;
}

我已尝试测试此对齐方式,该对齐方式LG G2运行相同Android 4.2.2且具有QualComm编码器,但看起来它无法正常工作。UV平面未对齐(框架底部的绿色条纹)。我无法计算适用于两部手机的填充。

我也可以使用芯片组Sony Xperia Z1运行,看起来它没有这样的问题。每种分辨率的视频看起来都很好,并且无论如何都不需要对齐平面。Android 4.3QualCommY

我知道它与硬件相关并且可能很复杂,但是因为在4.3我有问题之前我必须支持运行 Android 的用户。是否可以以编程方式确定Y编码器期望给定颜色格式的平面对齐和垂直/水平步幅值?

4

1 回答 1

8

简而言之,问题是:在 Android 4.3(API 18)之前,没有针对视频编码的CTS 测试。

结果,MediaCodec跨不同设备的行为不一致,并且一些错误未被注意到。EncodeDecodeTest测试执行您询问的功能,因此您可以可靠地将 YUV 数据提供给4.3+设备(尽管您仍然需要运行时检测它是否需要平面或半平面)。

对于您的具体问题,较旧的 Qualcomm 设备上的 Y 平面需要在 2K 边界处对齐,这与您的代码所做的不太一样。对于 720p 视频,这自然会发生 (720*1280 == 450 * 2048),对于 176x144,您需要调整 1280 以在 26624 而不是 25344 开始 UV 平面。您需要在缓冲区内设置绝对对齐,而不是固定填充量 - 使用uvoffset = (width*height + 2047) & ~2047.

您将需要检测编解码器供应商和 Android 软件版本,如果是 4.3 之前的高通,则需要进行此调整。如果您的需求发生变化,并且您可以针对 API 18+,这些问题就会消失。(并且您可以使用Surfaceinput 来MediaCodec避免 U/V 交换问题,但取决于您的需要,这可能没有用处。)

于 2013-12-20T16:11:53.363 回答