FrameType を選ぶ
processImage の前に ImageFrame.type を設定します。追加のモード引数はありません。
FrameType.VIDEO(デフォルト)
- カメラプレビュー、ビデオ通話、ライブ配信
- 遅延が低い
FrameType.IMAGE
- ギャラリー写真、書き出し、静止画キャプチャ
- 画質は高く、1 フレームあたりのコストは大きい
大きな静止画(プレビューと書き出し)
高解像度の静止画では、スライダーのたびに原寸をprocessImage に渡さないでください。縮小したあとに原画を捨てないでください。
写真を開いたら完全な Bitmap を残し、プレビュー用フレームを 1 枚作ります(長辺は約 1280–1440)。パラメータ調整はプレビュー(FrameType.IMAGE)に対して processImage し、書き出しは同じ setter で全サイズをもう一度処理します。出力サイズは入力フレームと同じです。プレビューを拡大して書き出しにしないでください。カメラプレビューはキャプチャ解像度 + FrameType.VIDEO のままです。
パラメータ範囲
低めから始め、顔検出と FPS を確認してから上げます。
ライブプレビュー(例):
setBeautySkinOnly(true) を有効にします。
プリセット名: パラメータ列挙。
メモリ
ピクセルデータからフレームを作成するときは directByteBuffer を使います。
- プロセス / GL コンテキストごとにエンジンは 1 つ。フレームごとに作成しないでください
- インタラクティブな静止画: プレビュー用にコピーをスケールし、書き出し用に元の
Bitmapを残します。大きな静止画 を参照 convert()は新しいフレームを割り当てます。解放してください
OpenGL ES
externalContext = true の場合:
- カレントコンテキスト付きの GL スレッドでエンジンを構築します
- 入力テクスチャ、
processImage、出力テクスチャは同じコンテキスト上に保ちます - コンテキスト喪失後はエンジンを再作成します
- GPU 上に留まる場合は CPU へダウンロードせず、
output.getTexture()で結果を読みます
1 つのエンジンとアプリケーションコンテキスト
BeautyEffectEngine は 1 つだけ保持します。Activity より長く生きるように getApplicationContext() を使い、セッション終了時は必ず release() します。
UI スレッド以外で実行
processImage はカメラ / GL / 専用スレッドで実行します。UI 向けの結果だけメインルーパーに post します。
ImageFrame をスレッド間で共有しないでください。デモのカメラ経路は、レンダースレッドで最新フレームを処理します。
assets からのフィルターとステッカー
.fbd ファイルを assets/ に置き、byte[] を渡す(または filesDir にコピーしてパスを渡す)ようにします。ユーザーが効果を選んだときに setFilter / setSticker を 1 回呼び、毎フレーム呼ばないでください。ミックスは setFilterIntensity で調整します。
変更は次の processImage で有効になります。
getStats で監視
avgProcessTimeMs が約 33 ms を超え続ける場合は、解像度を下げ、FrameType.VIDEO を使うか、同時のリシェイプ / メイク / バーチャル背景を減らしてください。
ユーザースライダーの永続化
強度はアプリ側で保存します(SharedPreferences)。エンジン作成後に setSmoothing、setReshape、setLipstick などで再適用してください。SDK は UI 状態を永続化しません。
ライフサイクル
onResume/onPause: カメラの開始と停止。すぐ再開する場合はエンジンを保持できますonDestroy/onDetach: このオーナーが作成したならengine.release()externalContext: GL スレッドで作成 / 破棄
テスト
licenseToken、または到達可能な /facebetter/v2/auth とバインド済みパッケージ名)。
