有关此主题的一些相关问题和讨论:
我正在将相机预览帧(NV21
转换为NV12
)提供给MediaCodec
编码器(NV12
又名COLOR_FormatYUV420SemiPlanar
)。在QualComm
编码器运行Android版本低于4.3
的某些设备上看起来就是这样。我必须进行一些输入帧处理才能接收正确颜色的背帧。
在Sony Xperia ZR
正在运行Android 4.2.2
我必须添加Y
平面对齐,以使其能够处理几乎所有分辨率。上面的代码为宽度添加了1024
字节对齐,对于其他分辨率,这些宽度不能被32
和2048
字节对齐。它会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.3
的{{1}},看起来它没有这样的问题。每个分辨率的视频都很好,QualComm
平面无论如何都不需要对齐。
我知道它与硬件有关并且可能很复杂,但由于我必须支持在Y
之前运行Android的用户,因此我有一个问题。是否有可能以编程方式确定编码器期望的给定颜色格式的4.3
平面对齐和垂直/水平步幅值?
答案 0 :(得分:7)
问题简而言之:在Android 4.3(API 18)之前,视频编码没有CTS tests。
因此,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版之前的Qualcomm,则需要进行此调整。如果您的要求发生变化,并且您可以针对API 18+,则这些问题就会消失。 (并且您可以使用Surface
输入到MediaCodec
,这可以避免U / V交换问题,但这取决于您可能没用的需求。)