【iOS】ズーム倍率に応じてカメラ映像をシームレスに切り替える
iOSにプリインストールされているカメラアプリのように、ズーム倍率に応じて超広角レンズカメラ、広角レンズカメラ、望遠レンズカメラと、カメラ映像をシームレスに切り替える方法について書きます。
本記事をお読みいただくことで、以下の内容を学ぶことができます。
- ズーム倍率に応じてカメラ映像をシームレスに切り替える方法
- バーチャルカメラを使用したズーム倍率変更時の挙動
本記事の内容は、「詳解 AVFoundation Capture」から一部の説明を抜粋した内容になっています。
ズーム倍率の変更
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
・builtInTripleCamera
・builtInDualWideCamera
・builtInDualCamera
-
バーチャルカメラ
*「iOS の複数カメラキャプチャの紹介- WWDC19」で、複数のカメラを使用した仮想
的なデバイスのことを、"バーチャルカメラ"と命名しています。 ↩︎
Discussion