本文列举了使用美颜特效SDK过程中可能遇到的技术问题及解决办法。
目录
美颜SDK的API使用要求?
美颜SDK所有API,包括创建、配置、使用、销毁,在整个使用过程中,必须确保满足如下两个条件:
始终在同一个线程中调用。
该线程必须要有GL上下文。若没有,可通过接口,改由Queen内部去创建。
问题排查调试方法?
Android端:
engine创建完成后,打开debug开关。
engine.enableDebugLog();
可以通过过滤“Queen”关键字来查看当前美颜SDK运行状态的日志输出,如下:
其中,过滤d级日志,信息较多,过滤i级日志,信息集中。
输入输出参数怎么填?
SDK内置了智能自动检测当前画面最佳输入参数的算法,通过如下两个步骤,可以开启查看当前所预期需要的输入参数。
创建engine时,指定算法输入模式为自动模式。config.algInputMode = AlgInputMode.kModeAutomatic;
开启debugLog模式,即engine创建完成后,打开debug开关。
engine.enableDebugLog();
通过过滤日志,可以看到如下的Logcat输出。
其中,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
中,各应用可在此基础上直接或适当调整使用。