ハイライト
AVCaptureDeviceInputでisCinematicVideoCaptureEnabledを true に設定するだけで、capture session の出力全体が自動的にシネマモードの効果を得られます。
主要内容
映画における浅い被写界深度と rack focus(フォーカスの切り替え)は、監督が視聴者の視線を誘導するための重要な手法です。実際の撮影現場では、フォーカスの切り替えに専任の focus puller が必要です。これは長期の訓練を要する繊細な作業だからです(01:14)。一般の開発者が App 内でこのような効果を実現しようとしても、以前はほとんど手の打ちようがありませんでした。
iPhone 13 Pro でシネマモードが導入されて以来、Apple はアルゴリズムによって人間の focus puller を代替しています。被写体が画面に入ると自動的に rack focus が行われ、被写体が別の場所を見るとフォーカスが別の候補対象に切り替わり、必要に応じてまた戻ります(01:31)。今年、iOS 26 はこの機能を Cinematic Video API として公開しました。Roy は完全なカメラ App を使って設定プロセスを実演しました。Dual Wide または TrueDepth カメラを選択し、Cinematic をサポートする format を探し、capture session を組み立て、metadata output を追加し、SwiftUI で検出枠を描画し、タップと長押しジェスチャーをバインドして 3 種類のフォーカスモードを駆動します。この一連の流れで、開発者は isCinematicVideoCaptureEnabled = true の一行だけで、movie file output、video data output、preview layer のすべてが同時にシネマ効果を得られます。
詳細
第一步:Cinematic に対応したデバイスと format を選択する。 Cinematic Video は背面の Dual Wide と前面の TrueDepth のみをサポートし、解像度は 1080p / 4K @ 30fps をカバーし、色は SDR の 420 video range / full range と 10-bit HDR の x420 をサポートします(05:37)。
// Select a format that supports Cinematic Video capture
for format in camera.formats {
if format.isCinematicVideoCaptureSupported {
try! camera.lockForConfiguration()
camera.activeFormat = format
camera.unlockForConfiguration()
break
}
}
重要ポイント:
isCinematicVideoCaptureSupportedはAVCaptureDevice.Formatの新しいプロパティで、最初に true になる format を見つけるまで反復処理します。activeFormatの変更はlockForConfiguration/unlockForConfigurationの間で行う必要があります。- Cinematic capture を有効にする前に正しい format を選択する必要があります。そうしないと後続の手順が失敗します。
第二步:input でシネマモードを有効にする。(06:00)
let videoInput = try! AVCaptureDeviceInput(device: camera)
captureSession.addInput(videoInput)
let audioInput = try! AVCaptureDeviceInput(device: microphone)
captureSession.addInput(audioInput)
// Enable Cinematic Video capture
if (videoInput.isCinematicVideoCaptureSupported) {
videoInput.isCinematicVideoCaptureEnabled = true
}
重要ポイント:
isCinematicVideoCaptureEnabled = trueの一行で、session のすべての output を Cinematic 経路に切り替えられます。AVCaptureMovieFileOutputの出力は disparity data + metadata + 生の動画を含み、2023 年に公開された Cinematic Framework を使って非破壊的な bokeh 編集が可能です。AVCaptureVideoDataOutputのフレームは浅い被写界深度がすでに焼き込まれており、直接ストリーミングやアップロードに適しています。AVCaptureVideoPreviewLayerは bokeh をリアルタイムにレンダリングし、finder として使うには session に挂けるだけで済みます。
第三步:SwiftUI で preview を表示する。 AVCaptureVideoPreviewLayer は CALayer のサブクラスなので、UIViewRepresentable で包む必要があります(07:11)。
class CameraPreviewUIView: UIView {
override class var layerClass: AnyClass {
AVCaptureVideoPreviewLayer.self
}
var previewLayer: AVCaptureVideoPreviewLayer {
layer as! AVCaptureVideoPreviewLayer
}
}
重要ポイント:
layerClassをオーバーライドして、view の backing layer を直接AVCaptureVideoPreviewLayerにすることで、sublayer の手動管理を不要にします。previewLayerの getter を公開して上層から読みやすくし、座標変換で使用します。
第四步:metadata を取得して検出枠を描画する。 Cinematic アルゴリズムは顔などの検出情報に依存しており、Apple は必要なタイプを新しいプロパティにまとめています(09:12)。
let metadataOutput = AVCaptureMetadataOutput()
captureSession.addOutput(metadataOutput)
metadataOutput.metadataObjectTypes = metadataOutput.requiredMetadataObjectTypesForCinematicVideoCapture
metadataOutput.setMetadataObjectsDelegate(self, queue: sessionQueue)
重要ポイント:
requiredMetadataObjectTypesForCinematicVideoCaptureは新しいリストプロパティで、これを使用する必要があります。他のタイプを渡すと例外がスローされます。- delegate コールバックで metadata を
@Observableクラスに流し込み、SwiftUI view が自動的に再描画されます。 - 枠を描画するときは座標空間を変換する必要があります。
previewLayer.layerRectConverted(fromMetadataOutputRect: metadata.bounds)を使用します。AVFoundation は左上を原点とし、SwiftUIpositionは中心点を使うので、midX / midY に変換することを忘れないでください。
第五步:3 種類の手動フォーカス API。(10:53)
open func setCinematicVideoTrackingFocus(detectedObjectID: Int, focusMode: AVCaptureDevice.CinematicVideoFocusMode)
open func setCinematicVideoTrackingFocus(at point: CGPoint, focusMode: AVCaptureDevice.CinematicVideoFocusMode)
open func setCinematicVideoFixedFocus(at point: CGPoint, focusMode: AVCaptureDevice.CinematicVideoFocusMode)
重要ポイント:
- 最初のメソッド:
detectedObjectIDで特定の識別された被写体にロックします。 - 2 番目のメソッド:画面内の特定のポイントにフォーカスを合わせ、アルゴリズムがその付近の顕著なオブジェクトを探します。
- 3 番目のメソッド:フォーカスを固定し、disparity によってそのポイントがある平面をロックします。
CinematicVideoFocusModeは 3 段階:.none、.weak、.strong。strong はもっと目立つ候補があっても切り替えず、weak はアルゴリズムに委ねることを許可します。
第六步:ジェスチャーをフォーカスに接続する。 デモでは空白エリアをタップすると weak focus、既に weak の検出枠をタップすると strong にアップグレード、フォーカスされていない検出枠をタップすると weak になります(15:30)。
func focusTap(at point:CGPoint) {
try! camera.lockForConfiguration()
if let metadataObject = findTappedMetadataObject(at: point) {
if metadataObject.cinematicVideoFocusMode == .weak {
camera.setCinematicVideoTrackingFocus(detectedObjectID: metadataObject.objectID, focusMode: .strong)
} else {
camera.setCinematicVideoTrackingFocus(detectedObjectID: metadataObject.objectID, focusMode: .weak)
}
} else {
let transformedPoint = previewLayer.metadataOutputRectConverted(fromLayerRect: CGRect(origin:point, size:.zero)).origin
camera.setCinematicVideoTrackingFocus(at: transformedPoint, focusMode: .weak)
}
camera.unlockForConfiguration()
}
重要ポイント:
findTappedMetadataObjectを使ってタップが特定の検出枠内にあるかを逆引きします。- 既に weak の枠にヒットすると strong にアップグレード(実線の黄枠)、他の状態にヒットするとまず weak になります(点線の黄枠)。
- どの枠にもヒットしない場合:画面座標を metadata output 座標に変換し、
setCinematicVideoTrackingFocus(at:focusMode:)を呼び出します。 - 長押しの場合は
setCinematicVideoFixedFocusを使い、フォーカスをその disparity 平面に固定します。
第七步:bokeh 強度とシーン監視。 AVCaptureDeviceInput.simulatedAperture は f-stop で表現され、f 値が小さいほど絞りが大きく、bokeh が強くなります。format の minSimulatedAperture / maxSimulatedAperture / defaultSimulatedAperture で slider の範囲を制限します(08:05)。光量が不足している場合は KVO cinematicVideoCaptureSceneMonitoringStatuses を通じて、.notEnoughLight が含まれるときに UI でユーザーに通知します(17:10)。録画中に AVCapturePhotoOutput を追加して静止写真を撮ることもでき、写真も同様にシネマ効果が付きます。
重要ポイント
-
何をするか:既存のカメラ系 App に「シネマモード」スイッチを追加する
- なぜ価値があるか:API は極めて薄く、
isCinematicVideoCaptureEnabled = trueの一行で disparity + metadata + 焼き込み済み動画が得られます。製品の差別化ポイントが直接広がります。 - どのように始めるか:まず
AVCaptureDevice.Format.isCinematicVideoCaptureSupportedで format をフィルタリングし、input を切り替えます。元のモードを残して A/B 比較を行い、ユーザーが撮影前に選べるようにします。
- なぜ価値があるか:API は極めて薄く、
-
何をするか:「短视频后期可調焦点(ショート動画の後期フォーカス調整)」編集ツールを作る
- なぜ価値があるか:Movie file output の出力動画は disparity data を含み、2023 年に公開された Cinematic Framework と組み合わせて非破壊的な bokeh 編集が可能で、フォーカスとぼかし度の両方を変更できます。
- どのように始めるか:録画側は
AVCaptureMovieFileOutputを使用し、編集側は Cinematic Framework を導入します。MVP はまずタイムラインにいくつかの focus keyframe を追加することから始めます。
-
何をするか:顔 / ペット検出の weak / strong フォーカスロジックを vlog テンプレート化する
- なぜ価値があるか:ユーザーは最も頻繁に人やペットを撮影し、自動 rack focus こそが vlog 体感の最高レベルです。strong ロックは主体が通行人にフォーカスを奪われるのを防げます。
- どのように始めるか:metadata を監視し、主役の顔にはデフォルトで strong、脇役の顔にはデフォルトで weak を適用します。「主役をロック」ボタンを提供して、直接
setCinematicVideoTrackingFocus(detectedObjectID:focusMode:.strong)を呼び出せるようにします。
-
何をするか:光量監視の通知レイヤーを追加する
- なぜ価値があるか:シネマモードは光に敏感で、光が弱いときは bokeh の品質が明らかに低下します。ユーザーが通知を見ないと App が壊れていると誤解する可能性があります。
- どのように始めるか:KVO で
cinematicVideoCaptureSceneMonitoringStatusesを監視し、.notEnoughLightが含まれるときは finder の隅に警告を表示し、count がゼロになったときに非表示にします。
関連セッション
- Enhance your app with machine-learning-based video effects — 機械学習を使って動画にフレームレート変換、超解像、ノイズ除去などの効果を追加し、シネマモードと組み合わせて後処理を行うことができます。
- Enhancing your camera experience with capture controls — カメラ App の capture controls をカスタマイズし、シネマモードのスイッチをより使いやすくします。
- Support Cinematic mode videos in your app — 2023 年に公開された Cinematic Framework。本 session の movie file と組み合わせて非破壊的な bokeh 編集を行います。
- Enhance your app’s audio content creation capabilities — Spatial audio 録音。シネマモードの first order ambisonics と組み合わせて没入感を高めます。
コメント
GitHub Issues · utterances