本文列舉了使用美顏特效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
中,各應用可在此基礎上直接或適當調整使用。