> Mediacodec and camera,color space incorrect
> Getting QualComm encoders to work via MediaCodec API
> https://groups.google.com/d/msg/android-platform/awaNwgb6EbY/a-YiIOwaL0QJ
> https://code.google.com/p/android/issues/detail?id=37769
我正在将相机预览帧(NV21转换为NV12)馈送到MediaCodec编码器(NV12 aka color_FormatYUV420SemiPlanar).看起来在使用QualComm编码器的某些设备上运行的AndroID版本低于4.3我必须做一些输入帧处理才能接收正确颜色的背帧.
在运行AndroID 4.2.2的Sony Xperia ZR上,我必须添加Y平面对齐,以使其适用于几乎所有分辨率.上面的代码为宽度添加1024字节对齐,对于其他分辨率,不能将32和2048字节对齐.它使MediaCodec能够正确编码所有分辨率的帧,可以除以16(除了176×144,其中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;}
我试图在运行相同的AndroID 4.2.2且具有QualComm编码器的LG G2上测试这种对齐,看起来它没有正确地工作. UV平面未对齐(框架底部的绿色条纹).我无法计算适用于这两款手机的填充.
我还可以使用QualComm芯片组访问运行AndroID 4.3的Sony Xperia Z1,看起来它没有这样的问题.每个分辨率的视频都很好,Y平面无论如何都不需要对齐.
我知道它与硬件有关并且可能很复杂,但由于我必须支持在4.3之前运行AndroID的用户,我有一个问题.是否有可能以编程方式确定编码器期望给定颜色格式的Y平面对齐和垂直/水平步幅值?
解决方法 问题简而言之:在AndroID 4.3(API 18)之前,视频编码没有 CTS tests.因此,MediaCodec在不同设备上的行为不一致,并且一些错误未被注意到. EncodeDecodeTest测试会运行您所询问的功能,因此您可以可靠地将YUV数据提供给4.3设备(尽管您仍需要运行时检测它是否需要平面或半平面).
对于您的特定问题,较旧的Qualcomm设备上的Y平面需要在2K边界处对齐,这与您的代码不同.对于720p视频,这种情况自然发生(720 * 1280 == 450 * 2048),对于176×144,您需要调整1280以在26624而不是25344处启动UV平面.您需要在缓冲区内设置绝对对齐,而不是固定填充量 – 使用uvoffset =(wIDth * height 2047)& 〜2047.
您需要检测编解码器供应商和AndroID软件版本,如果是4.3版之前的Qualcomm,则需要进行此调整.如果您的需求发生变化,并且您可以针对API 18,则这些问题就会消失. (并且您可以使用Surface输入到MediaCodec,这可以避免U / V交换问题,但这取决于您可能没有用的需求.)
总结以上是内存溢出为你收集整理的android – 如何获取MediaCodec编码器的步幅和Y平面对齐值全部内容,希望文章能够帮你解决android – 如何获取MediaCodec编码器的步幅和Y平面对齐值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)