Skip to main content

연동

엔진 생성이 예외를 던지거나 준비되지 않음

  • IllegalArgumentException: EngineConfig에는 비어 있지 않은 licenseToken, 또는 appIdappKey가 모두 필요합니다
  • 대시보드에서 이 앱의 애플리케이션 패키지 이름을 바인딩하세요
  • 온라인 인증이면 /facebetter/v2/auth에 대한 네트워크 접근을 확인하세요
  • EngineEventCode.LICENSE_VALIDATION_FAILED / INITIALIZATION_FAILED를 수신하세요
  • new BeautyEffectEngine(...) 전에 setLogConfig를 호출하세요
인증: 인증 및 라이선스.

컴파일: net.pixpark.facebetter를 해석할 수 없음

  • Maven: implementation 'net.pixpark:facebetter:2.0.0'
  • 로컬 AAR: implementation files('libs/facebetter.aar') 후 Sync
  • Clean / Rebuild

UnsatisfiedLinkError

  • 기기 ABI는 arm64-v8a 또는 armeabi-v7a여야 합니다
  • shrink/obfuscate를 쓰면 libfacebetter.so를 유지하고, ProGuard / R8에서 Facebetter native 메서드를 유지하세요
  • AAR / Maven 아티팩트가 완전한지 확인하세요

효과

뷰티가 약해 보임

  • [0, 1] 범위에서 강도를 높이세요(setSmoothing, setWhitening, 메이크업, …)
  • 리셰이프는 **[-1, 1]**입니다. 0에 가까우면 거의 꺼진 상태입니다
  • INITIALIZATION_COMPLETEprocessImage가 null이 아닌 프레임을 반환하는지 확인하세요
  • onFaceLandmarks로 랜드마크를 확인하세요(빈 목록 = 얼굴 없음)

얼굴이 왜곡됨

  • setReshape 절댓값을 낮추세요. 부호를 바꾸면 방향이 반대가 됩니다
  • 여러 리셰이프 노브를 높은 절댓값으로 쌓지 마세요
  • 라이브 VIDEO가 더 부드럽고 강하지 않다면, 정지 내보내기에는 FrameType.IMAGE를 사용하세요

가상 배경이 동작하지 않음

  • setVirtualBackgroundBlur(level)level > 0으로 호출하거나, 또는 setVirtualBackground(path|bytes)를 호출하세요
  • setVirtualBackgroundBlur(0)은 효과를 지웁니다
  • 이미지 경로는 읽을 수 있는 PNG/JPG여야 합니다. 빈 경로는 ErrorCode.INVALID_ARGUMENT를 반환합니다
  • 그린스크린: setChromaKey(ChromaKeyColor.GREEN)과 채우기(블러 또는 이미지)
  • clearChromaKey()는 인물 마스크만 복원하며, 채우기는 제거하지 않습니다

필터 또는 스티커가 나타나지 않음

  • setFilter / setSticker.fbd 경로 또는 바이트를 전달하세요(등록 API 없음)
  • 업로드는 GL 스레드의 다음 processImage에서 이루어집니다
  • externalContext = true이면 해당 호출은 현재 GL 컨텍스트가 있는 상태에서 실행되어야 합니다
  • setFilterIntensity(0)이면 LUT가 보이지 않습니다

성능과 메모리

미리보기가 느림

  • input.type = ImageFrame.FrameType.VIDEO
  • 캡처 해상도를 낮추세요
  • 동시에 켜는 리셰이프 / 메이크업 / VB 효과를 줄이세요
  • processImage는 메인 스레드가 아닌 카메라 또는 GL 스레드에서
  • engine.getStats().avgProcessTimeMs를 확인하세요
  • 갤러리 대형: 사진을 열 때 작은 미리보기 프레임을 만들고, 내보낼 때 원본을 한 번 처리하세요. 권장 사항을 보세요

메모리가 늘어나거나 네이티브 크래시

  • convert() 결과와 processImage 출력을 포함해 모든 ImageFramerelease()를 호출하세요
  • ByteBuffer.allocateDirect를 사용하세요
  • 엔진은 하나이며, onDestroy에서 engine.release()를 호출하세요

ANR

  • HD 비디오에 대해 UI 스레드에서 processImage를 실행하지 마세요
  • 메인 스레드에서 큰 .fbd / JPEG 파일을 로드하지 마세요

이미지와 카메라

픽셀 형식을 어떻게 바꾸나요?

ImageFrame.convert(Format)을 사용합니다(새 프레임 반환):
패킹된 픽셀: getData(). 플래너 YUV: getDataY() / getDataU() / getDataV() 또는 getDataUV().

Camera2 미리보기

  1. YUV_420_888에서 Image
  2. ImageFrame.createWithAndroid420(...)
  3. 센서 + 전면 카메라에 맞게 rotate / mirror
  4. input.type = FrameType.VIDEO
  5. processImage(input)
  6. 표시를 위해 convert 또는 getTexture()

회전

rotate(ImageFrame.Rotation.ROTATION_90)(0 / 90 / 180 / 270, 시계 방향)은 프레임을 변경합니다.

권한

온라인 인증:
카메라 미리보기: CAMERA(API 23+에서 런타임 요청). 앱 저장소 밖의 파일 로그는 구버전 API에서 저장소 권한이 필요할 수 있습니다.

디버깅

엔진을 만들기 전에 로그를 켭니다.
Setter는 성공 시 0을 반환합니다. -1 = 잘못된 인자, -2 = 미초기화. 전체 목록: 오류 처리.

호환성

  • Android 7.0 (API 24)+
  • ABI: arm64-v8a, armeabi-v7a
  • Maven: net.pixpark:facebetter:2.0.0
업그레이드: Maven / AAR 버전을 올리고, Clean, 재빌드한 뒤 라이선스 + 카메라 + 정지를 다시 테스트하세요.