📷

【iOS】ズーム倍率に応じてカメラ映像をシームレスに切り替える

に公開

iOSにプリインストールされているカメラアプリのように、ズーム倍率に応じて超広角レンズカメラ、広角レンズカメラ、望遠レンズカメラと、カメラ映像をシームレスに切り替える方法について書きます。

本記事をお読みいただくことで、以下の内容を学ぶことができます。

  • ズーム倍率に応じてカメラ映像をシームレスに切り替える方法
  • バーチャルカメラを使用したズーム倍率変更時の挙動

本記事の内容は、「詳解 AVFoundation Capture」から一部の説明を抜粋した内容になっています。
https://naoya-maeda.booth.pm/items/6760109

ズーム倍率の変更

AVCaptureDevice オブジェクトのvideoZoomFactor プロパティは、ズーム倍率を変更することができるプロパティです。
https://developer.apple.com/documentation/avfoundation/avcapturedevice/videozoomfactor

CGFloat オブジェクトを代入することで、ズーム倍率を変更することができます。

シングルカメラを使用したズーム

広角レンズカメラ、超広角レンズカメラ、望遠レンズカメラといった一つのカメラを使用している時は、AVCaptureDevice オブジェクトのvideoZoomFactor プロパティに代入した値が、ズーム倍率になります。以下のソースコードでは、videoZoomFactor プロパティに2.0を代入して、ズーム倍率を2.0倍に変更しています。

バーチャルカメラ[1]を使用したズーム

デュアルワイドレンズカメラ、トリプルレンズカメラを表すAVCaptureDevice オブジェクトのvideoZoomFactor プロパティに1.0 を代入すると、実際のズーム倍率が0.5倍となり、超広角レンズカメラの映像が表示されます。デュアルレンズカメラ、デュアルワイドレンズカメラ、トリプルレンズカメラといった複数のカメラで構成されるバーチャルカメラのうち、超広角レンズカメラが構成に含まれるバーチャルカメラは、「videoZoomFactor プロパティの値= ズーム倍率」となりません。

ズーム倍率に応じてカメラ映像をシームレスに切り替える

バーチャルカメラを表すAVCaptureDevice オブジェクトは、videoZoomFactor プロパティに代入された値に応じて、表示するカメラの映像をシームレスに切り替えます。例えば、トリプルレンズカメラを使用している時に、ズーム倍率を大きくしていくと、ズーム倍率の大きさに応じて、[超広角レンズカメラ] -> [広角レンズカメラ] -> [望遠レンズカメラ] と表示するカメラの映像が自動的に切り替わります。
デュアルワイドレンズカメラ、トリプルレンズカメラを表すAVCaptureDevice オブジェクトのvideoZoomFactor プロパティに1.0を代入した時は、実際のズーム倍率が0.5倍になり、超広角レンズカメラの映像が表示されます。そして、videoZoomFactor プロパティに2.0を代入を代入した時は、実際のズーム倍率が1.0 倍になり、広角レンズカメラの映像が表示されます。
つまり、デュアルワイドレンズカメラ、トリプルレンズカメラを表すAVCaptureDevice オブジェクトのvideoZoomFactor プロパティの値が、1.0 以上2.0 未満の時は、超広角レンズカメラの映像が表示され、videoZoomFactor プロパティに2.0 をセットしたと同時に広角レンズカメラの映像に切り替わります。トリプルレンズカメラの時、さらにvideoZoomFactor プロパティに代入する値を大きくしていくと、videoZoomFactor プロパティが一定の値に達した時に、望遠レンズカメラのズーム映像に切り替わります。
一方、デュアルレンズカメラを表すAVCaptureDevice オブジェクトのvideoZoomFactor プロパティに、1.0を代入した時は、実際のズーム倍率も1.0倍になり、広角レンズカメラの映像が表示されます。さらに、videoZoomFactor プロパティに代入する値を大きくしていくと、一定の値に達した時に、望遠レンズカメラの映像が表示されます。つまり、デュアルレンズカメラを表すAVCaptureDevice オブジェクトのvideoZoomFactor プロパティの値が、1.0以上、一定の値未満の時は、広角レンズカメラの映像が表示され、videoZoomFactor プロパティが一定の値に達した時に、望遠レンズカメラの映像に切り替わります。このように、バーチャルカメラを使用している時は設定されたズーム倍率に応じて、使用するカメラの映像が自動で切り替わります。

実装方法

トリプルレンズカメラ、デュアルワイドレンズカメラ、デュアルカメラを表すAVCaptureDevice オブジェクトを取得します。取得したAVCaptureDevice オブジェクトをinit(device:)device 引数に指定して生成したAVCaptureDeviceInput オブジェクトを、AVCaptureSession オブジェクトに追加します。以下のソースコードでは、トリプルレンスカメラからの入力を表すAVCaptureDeviceInput オブジェクトを取得し、AVCaptureSession オブジェクトに追加しています。

あとは、AVCaptureDevice オブジェクトのvideoZoomFactor プロパティに、CGFloat オブジェクトを代入することで、ズーム倍率を変更することができます。

カメラ映像が切り替わるズーム倍率

バーチャルカメラを表すAVCaptureDevice オブジェクトのvirtualDeviceSwitchOverVideoZoomFactors プロパティで、ズーム中にカメラの映像が切り替わる閾値を取得することができます。

例えば、iPhone 14 Pro では[2, 6]を取得することができます。つまり、.builtInTripleCamera を使用している時、videoZoomFactor に2.0をセットすると、広角レンズカメラの映像が、6.0をセットすると、望遠レンズカメラの映像が表示されるということになります。

上記は、iPhone 13 miniでサンプルソースを動かした時のスクリーンショットキャプチャです。virtualDeviceSwitchOverVideoZoomFactors には「2」が格納されており、ズーム倍率が2.0倍になった瞬間、超広角レンズカメラから広角レンズカメラの映像に切り替わっていることを確認することができます。

参考資料

・詳解 AVFoundation Capture
https://naoya-maeda.booth.pm/items/6760109

・builtInTripleCamera
https://developer.apple.com/documentation/avfoundation/avcapturedevice/devicetype-swift.struct/builtintriplecamera

・builtInDualWideCamera
https://developer.apple.com/documentation/avfoundation/avcapturedevice/devicetype/3377620-builtindualwidecamera

・builtInDualCamera
https://developer.apple.com/documentation/avfoundation/avcapturedevice/devicetype/2727142-builtindualcamera

脚注
  1. バーチャルカメラ
    *「iOS の複数カメラキャプチャの紹介- WWDC19」で、複数のカメラを使用した仮想
    的なデバイスのことを、"バーチャルカメラ"と命名しています。 ↩︎

Discussion