メインコンテンツまでスキップ

第19章:ハイスピードビデオ

スローモーションビデオは、人間の目では捉えられない瞬間を記録します。蛇口から落ちる水滴を 120 fps(4倍スロー)で捉えたり、ハチドリの羽ばたきを 240 fps(8倍スロー)で観察したりできます。Camera2 API で高フレームレート撮影を実装するのは、単に FPS の設定値を上げるだけではありません。専用の CameraConstrainedHighSpeedCaptureSession を使用し、createHighSpeedRequestList で事前検証されたバーストを送信する必要があります。

Android Camera Parameters アプリでは、お使いのデバイスがどの解像度でどの FPS 範囲(120, 240 など)をサポートしているかを確認できます。


なぜ標準セッションでは 240 FPS で動作しないのか

30 fps の撮影と 240 fps の撮影では、システムへの負荷が根本的に異なります。

  • スループット: 1080p/240fps では、毎秒約 720MB もの画素データがメモリを流れます。
  • レイテンシ予算: 240 fps では、1 フレームの処理に 4.167ms しか許されません。
  • CPU オーバーヘッド: フレームごとに個別のリクエストを Java/Kotlin から送信すると、その通信(Binder IPC)だけで CPU を使い果たしてしまいます。

ハイスピードキャプチャセッションは、複数のリクエストを 1 つのバーストリストとしてまとめ、HAL(ハードウェア層)のスケジューラに直接渡すことで、これらのオーバーヘッドを劇的に削減します。


サポートされているサイズの確認

ハイスピード撮影では、通常の getOutputSizes() ではなく、専用のメソッドを使用する必要があります。

val configMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
// ハイスピード対応のサイズを取得
val highSpeedSizes = configMap?.highSpeedVideoSizes
// そのサイズで利用可能な FPS 範囲を取得
val fpsRanges = configMap?.getHighSpeedVideoFpsRangesFor(size)

多くのフラッグシップ機では 1080p で 240 fps をサポートしていますが、ミドルレンジ機では 720p に制限されることがあります。


実装のポイント

  1. セッションの作成: createCaptureSession ではなく、createConstrainedHighSpeedCaptureSession を呼び出します。
  2. 出力 Surface: プレビュー用と録画用の最大 2 つまでに制限されます。
  3. リクエストリスト: createHighSpeedRequestList(builder.build()) を使用して、HAL が高速に処理できる形式に変換します。
  4. スローモーションの設定: MediaRecorder.setCaptureRate(fps) を呼び出すことで、撮影は高速で行い、再生は 30 fps で行う「スローモーション動画」として保存されます。
// ハイスピードリクエストの送信
val highSpeedRequestList = highSpeedSession.createHighSpeedRequestList(recordBuilder.build())
highSpeedSession.setRepeatingBurst(highSpeedRequestList, null, backgroundHandler)

最適化のヒント: 240 fps では毎秒大量のメタデータが発生するため、パフォーマンスを優先して CaptureCallbacknull に設定し、フレームごとのコールバックをスキップすることが推奨されます。


まとめ

  • 専用 API: 高フレームレートには CameraConstrainedHighSpeedCaptureSession が必須です。
  • 制約: Surface は 2 つまで、テンプレートは RECORD または PREVIEW のみ、といった厳格なルールがあります。
  • スローモーション: setCaptureRate でキャプチャ速度と再生速度の差を作ります。
  • パフォーマンス: バインダー通信を最小限に抑えるため、バーストリスト形式でリクエストを処理します。

次のステップ

高速撮影をマスターしました。次は、複数のレンズを操る技術です。第20章:マルチカメラでは、超広角・広角・望遠レンズをシームレスに切り替えたり、同時にキャプチャしたりする方法を学びます。