Skip to main content

FrameType を選ぶ

processImage の前に ImageFrame.type を設定します。追加のモード引数はありません。 FrameType.VIDEO(デフォルト)
  • カメラプレビュー、ビデオ通話、ライブ配信
  • 遅延が低い
FrameType.IMAGE
  • ギャラリー写真、書き出し、静止画キャプチャ
  • 画質は高く、1 フレームあたりのコストは大きい

大きな静止画(プレビューと書き出し)

高解像度の静止画では、スライダーのたびに原寸を processImage に渡さないでください。縮小したあとに原画を捨てないでください。 写真を開いたら完全な Bitmap を残し、プレビュー用フレームを 1 枚作ります(長辺は約 1280–1440)。パラメータ調整はプレビュー(FrameType.IMAGE)に対して processImage し、書き出しは同じ setter で全サイズをもう一度処理します。出力サイズは入力フレームと同じです。プレビューを拡大して書き出しにしないでください。カメラプレビューはキャプチャ解像度 + FrameType.VIDEO のままです。

パラメータ範囲

低めから始め、顔検出と FPS を確認してから上げます。 ライブプレビュー(例):
髪 / 衣服 / 背景にスムージングをかけたくない場合は setBeautySkinOnly(true) を有効にします。 プリセット名: パラメータ列挙

メモリ

ピクセルデータからフレームを作成するときは direct ByteBuffer を使います。
ネイティブフレームを解放します。
  • プロセス / GL コンテキストごとにエンジンは 1 つ。フレームごとに作成しないでください
  • インタラクティブな静止画: プレビュー用にコピーをスケールし、書き出し用に元の Bitmap を残します。大きな静止画 を参照
  • convert()新しいフレームを割り当てます。解放してください

OpenGL ES

externalContext = true の場合:
  • カレントコンテキスト付きの GL スレッドでエンジンを構築します
  • 入力テクスチャ、processImage、出力テクスチャは同じコンテキスト上に保ちます
  • コンテキスト喪失後はエンジンを再作成します
  • GPU 上に留まる場合は CPU へダウンロードせず、output.getTexture() で結果を読みます
美顔の実装 を参照してください。

1 つのエンジンとアプリケーションコンテキスト

BeautyEffectEngine は 1 つだけ保持します。Activity より長く生きるように getApplicationContext() を使い、セッション終了時は必ず release() します。
セッション終了時は必ずエンジンを release() してください。ImageFrame オブジェクトも release() が必要です。

UI スレッド以外で実行

processImage はカメラ / GL / 専用スレッドで実行します。UI 向けの結果だけメインルーパーに post します。
独自のロックなしに、1 つの ImageFrame をスレッド間で共有しないでください。デモのカメラ経路は、レンダースレッドで最新フレームを処理します。

assets からのフィルターとステッカー

.fbd ファイルを assets/ に置き、byte[] を渡す(または filesDir にコピーしてパスを渡す)ようにします。ユーザーが効果を選んだときに setFilter / setSticker を 1 回呼び、毎フレーム呼ばないでください。ミックスは setFilterIntensity で調整します。 変更は次の processImage で有効になります。

getStats で監視

ライブ 30 FPS プレビューで avgProcessTimeMs が約 33 ms を超え続ける場合は、解像度を下げ、FrameType.VIDEO を使うか、同時のリシェイプ / メイク / バーチャル背景を減らしてください。

ユーザースライダーの永続化

強度はアプリ側で保存します(SharedPreferences)。エンジン作成後に setSmoothingsetReshapesetLipstick などで再適用してください。SDK は UI 状態を永続化しません。

ライフサイクル

  • onResume / onPause: カメラの開始と停止。すぐ再開する場合はエンジンを保持できます
  • onDestroy / onDetach: このオーナーが作成したなら engine.release()
  • externalContext: GL スレッドで作成 / 破棄

テスト

インストルメントテストには有効なライセンスが必要です(licenseToken、または到達可能な /facebetter/v2/auth とバインド済みパッケージ名)。