本文列举了使用美颜特效SDK过程中可能遇到的技术问题及解决办法。

目录

美颜SDK的API使用要求?

美颜SDK所有API,包括创建、配置、使用、销毁,在整个使用过程中,必须确保满足如下两个条件:
  • 始终在同一个线程中调用。
  • 该线程必须要有GL上下文。若没有,可通过接口,改由Queen内部去创建。

问题排查调试方法?

Android端:

engine创建完成后,打开debug开关。

engine.enableDebugLog();
可以通过过滤“Queen”关键字来查看当前美颜SDK运行状态的日志输出,如下:12

其中,过滤d级日志,信息较多,过滤i级日志,信息集中。

输入输出参数怎么填?

SDK内置了智能自动检测当前画面最佳输入参数的算法,通过如下两个步骤,可以开启查看当前所预期需要的输入参数。
  1. 创建engine时,指定算法输入模式为自动模式。config.algInputMode = AlgInputMode.kModeAutomatic;3
  2. 开启debugLog模式,即engine创建完成后,打开debug开关。
    engine.enableDebugLog();

    通过过滤日志,可以看到如下的Logcat输出。

    4

    其中,input_angle,out_angle,out_flip即为算法计算得出的,当前画面预期的输入参数值。

重要 智能算法检测画面会有额外性能开销,测试验证完毕后,请及时还原该两步的操作。

SDK性能表现如何?

美颜特效SDK历经多年迭代,在性能优化、效果优化、效率优化方面力求做到业内领先。尤其,性能优化一直是美颜特效SDK在技术侧最为看重的方面,经过多轮优化,已达到性能水平领先,尤其在低端机和东南亚地区较老系统版本中,进行专项优化与迭代。对同一功能提供多种版本,例如美颜模块,提供高级模式、省电模式、智能调节模式等更好去适配客户实际场景。同时,日常迭代中,每个版本均有专门的多维度性能测试报告,并在多个内外部客户中得到大规模验证与应用。

如何解决屏幕黑屏问题?

出现原因:常见是由于纹理ID错误或生成纹理错误所致,偶尔会出现个别客户对返回后的纹理ID使用不当或使用无效纹理ID进行自身业务层的绘制而产生黑屏的问题。

解决方法:美颜特效SDK的渲染层基于OpenGL实现,只要确保传入美颜特效SDK接口的纹理ID是正常显示,则美颜特效SDK可以保障传出的画面纹理是正常可显示的。即便没有应用任何效果甚至是参数错误或者是没有授权情况下,美颜特效SDK也会保证将原始纹理进行返回。

接入美颜特效SDK后,画面纯色闪烁,移动手机后,画面颜色变化,但仍然没有画面?

出现条件:engine的构造参数toScreen为true,input纹理为oes纹理,render采用无参render()。

解决方法:render()改为renderTexture(matrix) ,如果输入纹理是oes的,则需要使用renderTexture,其中参数matrix是需要从surfaceTexture中获取的。

启动后闪退问题?

检查engine.setInputTexture中的textureId是否正确,确保正确后,重新启动。

贴纸/美妆功能,人脸像呈90度横屏后,人脸不可识别问题?

出现条件:engine的构造参数toScreen为true,input纹理为oes纹理,render采用无参render(),且算法运算采用取帧方案,而非bytebuffer方案。

解决方法:用bytebuffer方案,人脸能识别,但因为宽高的原因,会出现被错误拉大或拉窄情况。

基础美颜有效,高级美颜/美妆/贴纸无效问题?

基础美颜有效,说明Queen-engine的初始化/设参/渲染流程是通的,高级美颜无效,通常是由于设置参数错误,导致识别不了人脸,从而导致一切需要人脸关键点的效果均失效。常见的可能设置错误的参数,主要有三种情况:

  • 设置纹理输入时宽高参数错误,如接口:setInputTexture(int texture, int width, int height, boolean isOES),其中width/height必须是当前texture的显示宽高大小,需与texture参数匹配。第四个参数isOES直接决定了texture是否是一个oes纹理(Android特有),是否是oes纹理决定了Queen-engine内部是否需要做纹理显示转换(对应需要render传入当前相机采集时正确的matrix)。此处的宽/高直接决定了显示画面渲染的宽高比,从而可能影响到高级功能的效果在具体渲染时的画面缩放比。常见的影响效果是,高级功能效果可用,但尺寸被拉大且变形。
  • 设置输入数据时的宽高参数错误,如接口:updateInputDataAndRunAlg(byte[] imageData, int format, int width, int height, int stride, int inputAngle, int outAngle, int flipAxis, boolean reuseData),其中的width/height指示的是当前输入数据ImageData的实际宽/高,它和上面第1种情况中的宽/高,可能是相同参数,也可能是相反参数(如Android端直接从相机里获取到的buffer都是旋转90度的,宽/高刚好相反)。此处的宽/高直接决定了人脸头像是否能正常识别,进而直接影响功能是否可用。
  • 设置输入数据时的输入角度/输出角度/xy轴旋转等参数错误,如接口:updateInputDataAndRunAlg(byte[] imageData, int format, int width, int height, int stride, int inputAngle, int outAngle, int flipAxis, boolean reuseData)或者帧同步接口updateInputTextureBufferAndRunAlg(int inputAngle, int outAngle, int flipAxis, boolean usePreviousFrame),其中的inputAngle/outAngle/flipAxis都是高级功能中人脸识别所必需的参数。 参数inputAngle决定了算法如何使用传入的数据或纹理,是否需要旋转,旋转多少角度;参数outAngle决定了算法如何将识别结果进行渲染显示,是否需要旋转,旋转多少角度;参数flipAxis是个枚举值,Queen-engine内有定义,决定了最终渲染画面是否需要对称翻转,沿x轴还是y轴翻转;上述几个参数,对算法识别特别关键,且又和当前相机角度/前后摄像头密切相关,为方便处理,特地封装与整理到了相关处理工具类QueenCameraHelper.java中,各应用可在此基础上直接或适当调整使用。