WWDC Quick Look 💓 By SwiftGGTeam
Discover advancements in iOS camera capture: Depth, focus, and multitasking

Discover advancements in iOS camera capture: Depth, focus, and multitasking

元の動画を見る

ハイライト

iOS 15.4 および iOS 16 では、AVFoundation カメラ キャプチャに 4 つの主要な改善が加えられています。LiDAR スキャナの深度データは、AVFoundation を通じて直接アクセスできます。顔駆動のオートフォーカスと自動露出はデフォルトで有効になっています。プレビューと録画をそれぞれ最適化するために複数の AVCaptureVideoDataOutput を同時に構成するためのサポート。 iPad マルチタスクモードでカメラが強制的に中断されることはなくなりました。

主要内容

LiDAR 深度カメラが AVFoundation に登場

以前は、LiDAR スキャナーの深度データを使用したい場合は、ARKit を使用するしかありませんでした。 ARKit は AR アプリケーションに適していますが、解像度は 256x192 のみで、シーンのジオメトリやオブジェクトの配置などの AR シーンのデザイン向けに設計されています。

iOS 15.4の新機能.builtInLiDARDepthCameraAVFoundation が LiDAR に直接アクセスできるデバイス タイプ。これは写真やビデオのアプリケーションにとって重要です。深度解像度が 768x576 (ARKit の 2 倍以上) に向上し、高解像度の写真に埋め込むことができます。

LiDAR 深度カメラの動作原理は次のとおりです。LiDAR は環境に光を放射し、反射光を収集し、光の飛行時間を測定することで深度を計算します。同時に、システムは機械学習モデルを通じて LiDAR のまばらな出力と広角カメラのカラー画像を融合し、高密度の深度マップを生成します。

顔主導のフォーカスと露出

プロ仕様のカメラはすべて、顔追跡機能とフォーカス機能を備えています。 iOS 15.4 ではこの機能がすべてのアプリに導入され、デフォルトで有効になっています。

この機能がないと、カメラが背景に焦点を合わせてしまい、顔がぼやけてしまう可能性があります。オンにすると、顔は鮮明なままとなり、背を向けるとカメラは自動的に背景フォーカスに切り替わります。逆光のシーンでは、背景が白とびしても、顔の明るさを優先して露出します。

複数のビデオ出力の最適化されたプレビューと録画

よくある矛盾: プレビューには低遅延と小さいサイズが必要です。録音には高解像度と高品質のエフェクトが必要です。以前は AVCaptureVideoDataOutput が 1 つしかなく、侵害する必要がありました。

iOS 16 では、複数の AVCaptureVideoDataOutput の同時追加がサポートされており、それぞれが解像度、手ぶれ補正、向き、ピクセル形式を個別に設定できます。プレビューでは、低解像度の画像安定化されていない出力が使用されます。録画では、フィルムレベルの手ぶれ補正機能を備えた 4K 出力を使用します。

iPad のマルチタスクでカメラが中断されることはなくなりました

以前は、iPad が分割画面またはスライド オーバーに入ると、カメラはシステムによって強制的に中断されました。 iOS 16 以降、AVCaptureSession は引き続きマルチタスク モードでカメラを使用できます。

システムは、マルチタスク録画の完了を検出した後、1 回限りのプロンプトをポップアップ表示し、ビデオ品質が低下する可能性があることをユーザーに通知します。お申込みは下記からも行えますisMultitaskingCameraAccessEnabledプロパティはこの動作をチェックして制御します。

詳細

LiDAR深度カメラデバイス構成

02:21

import AVFoundation

// 发现 LiDAR Depth Camera
guard let device = AVCaptureDevice.default(.builtInLiDARDepthCamera, for: .video, position: .back) else {
    // 设备不支持 LiDAR Depth Camera
    return
}

// 创建输入和会话
let input = try AVCaptureDeviceInput(device: device)
let session = AVCaptureSession()
session.addInput(input)

// 添加深度数据输出
let depthOutput = AVCaptureDepthDataOutput()
depthOutput.setDelegate(self, callbackQueue: DispatchQueue(label: "depthQueue"))
session.addOutput(depthOutput)

// 添加照片输出(带深度)
let photoOutput = AVCapturePhotoOutput()
session.addOutput(photoOutput)

キーポイント:

  • .builtInLiDARDepthCameraiPhone 12 Pro、iPhone 13 Pro、iPad Pro 第 5 世代で利用可能
  • このデバイスは、背面の広角カメラを使用してビデオを提供し、LiDAR を使用して奥行きを提供します
  • すべてのフォーマットがディープデータ配信をサポート
  • 望遠カメラと超広角カメラが通過可能AVCaptureMultiCamSession同時に使用する

深度データフィルタリング制御

05:25

// 深度数据默认是过滤的(减少噪声、填充空洞)
// 适合摄影和视频应用

// 计算机视觉应用需要原始数据,关闭过滤
depthOutput.isFilteringEnabled = false

// 在委托回调中接收深度数据
func depthDataOutput(_ output: AVCaptureDepthDataOutput,
                     didOutput depthData: AVDepthData,
                     timestamp: CMTime,
                     connection: AVCaptureConnection) {
    // depthData.depthDataType 描述深度数据类型
    // depthData.depthDataAccuracy 描述精度(absolute 或 relative)
    // depthData.isDepthDataFiltered 描述是否经过过滤
    let pixelBuffer = depthData.depthDataMap
    // 处理深度像素缓冲
}

キーポイント:

  • フィルタリングはデフォルトで有効になっており、特殊効果のレンダリングに適しています
  • フィルタリングがオフの場合、LiDAR 深度カメラは信頼度の低いポイントを除外します
  • コンピューター ビジョン タスク (測定など) では、フィルターされていないデータを使用する必要があります。
  • 深度データの種類には、絶対深度 (LiDAR) と相対視差深度 (TrueDepth/デュアル カメラ) が含まれます。

顔主導のフォーカスと露出制御

09:04

guard let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else {
    return
}

do {
    try device.lockForConfiguration()
    
    // 关闭自动调整,才能手动控制
    device.automaticallyAdjustsFaceDrivenAutoFocusEnabled = false
    device.automaticallyAdjustsFaceDrivenAutoExposureEnabled = false
    
    // 手动开启或关闭
    device.isFaceDrivenAutoFocusEnabled = true
    device.isFaceDrivenAutoExposureEnabled = true
    
    device.unlockForConfiguration()
} catch {
    print("Could not lock device: \(error)")
}

キーポイント:

  • iOS 15.4 以降で、アプリが iOS 15.4 SDK にリンクされている場合、デフォルトで有効になります。
  • 最初に閉じる必要がありますautomaticallyAdjusts...変更するisEnabled
  • 写真アプリやビデオ通話アプリ (FaceTime など) に適しています
  • アプリでフォーカス/露出を手動で制御する必要がある場合は、この機能をオフにする必要があります。

複数のビデオ出力の構成

11:07

let session = AVCaptureSession()

// 预览输出:小尺寸、低延迟
let previewOutput = AVCaptureVideoDataOutput()
previewOutput.setSampleBufferDelegate(self, queue: previewQueue)
previewOutput.automaticallyConfiguresOutputBufferDimensions = false
previewOutput.deliversPreviewSizedOutputBuffers = true  // 预览尺寸
session.addOutput(previewOutput)

// 录制输出:全尺寸 4K
let recordOutput = AVCaptureVideoDataOutput()
recordOutput.setSampleBufferDelegate(self, queue: recordQueue)
// 默认就是全尺寸,无需额外配置
session.addOutput(recordOutput)

// 为录制输出配置电影级防抖
if let connection = recordOutput.connection(with: .video) {
    connection.preferredVideoStabilizationMode = .cinematicExtended
}

// 配置像素格式(10-bit 无损 YUV)
recordOutput.videoSettings = [
    kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange
]

キーポイント:

  • automaticallyConfiguresOutputBufferDimensions = falseこれはカスタム解像度を構成するための前提条件です。
  • deliversPreviewSizedOutputBuffers = true出力プレビュー サイズ (写真プリセットでデフォルトで有効)
  • 解像度をカスタマイズする場合、アスペクト比はデバイスのアスペクト比と一致している必要があります。
  • 異なる出力を異なる手ぶれ補正モードで設定可能: プレビュー用off録音時のレイテンシーを短縮cinematicExtended

マルチタスクカメラアクセスの構成

15:33

let session = AVCaptureSession()

// 检查多任务相机访问是否受支持
if session.isMultitaskingCameraAccessSupported {
    session.isMultitaskingCameraAccessEnabled = true
}

// 启用后,相机不会因为多任务而被中断
// 之前会收到 "video device not available with multiple foreground apps" 的中断

キーポイント:

  • isMultitaskingCameraAccessSupportedデバイスがサポートしているかどうかを確認する
  • 有効にした後、カメラは Split View、Slide Over、Stage Manager モードで引き続き動作します。
  • マルチタスクの記録が完了すると、システムは 1 回限りの品質プロンプトを表示します。
  • ARKit はマルチタスク カメラ アクセスをサポートしていません
  • アプリはシステム ストレス通知を監視し、リソースが不足している場合はフレーム レートを下げるか、低解像度の形式に切り替える必要があります。

ビデオ通話のピクチャー・イン・ピクチャーのサポート

17:23

iOS 15 ではビデオ通話ピクチャーインピクチャー API が導入され、ユーザーは iPad でマルチタスクをしながらビデオ通話を継続できるようになります。

import AVKit

// 设置视频通话的画中画控制器
let pipController = AVPictureInPictureController(contentSource: contentSource)
pipController.canStartPictureInPictureAutomaticallyFromInline = true

キーポイント:

  • 使用AVPictureInPictureVideoCallViewControllerピクチャー・イン・ピクチャー・ウィンドウのコンテンツをカスタマイズする
  • ビデオ通話やビデオ会議アプリケーションに最適
  • ユーザーは他のアプリケーションを操作しながら、ピクチャインピクチャウィンドウでリモート参加者を見ることができます

重要ポイント

  • LiDAR リアルタイム測定ツール: LiDAR 深度カメラの絶対深度機能を使用して、リアルタイム測定アプリケーションを作成します。ユーザーが物体に照準を合わせると、距離の値が画面に直接表示されます。入口API:AVCaptureDevice.default(.builtInLiDARDepthCamera, for: .video, position: .back) + AVDepthData

  • スマート ポートレート ライティング: LiDAR 深度マップと RealityKit を組み合わせて、写真撮影時に人の顔に自動的に光を当てるカメラ アプリケーションを作成します。深度マップは顔の位置を特定し、RealityKit は対応する位置に仮想光源をレンダリングします。エントリーAPI:LiDAR深度カメラ+ RealityKit.PointLight

  • プロフェッショナル ビデオ レコーダー: 2 つの AVCaptureVideoDataOutput を同時に構成します。プレビューでは手ぶれ補正なしの 720p で低遅延を確保し、録画では 4K 映画レベルの手ぶれ補正で画質を確保します。プレビュー時には軽量のフィルターを適用し、録画時には高品質のエフェクトを適用します。入口API:AVCaptureSession+複数のAVCaptureVideoDataOutput

  • iPad マルチタスク スキャナ: ドキュメント スキャン アプリケーションは Split View モードでの実行をサポートしており、ユーザーは参照ドキュメントを見ながらスキャンできます。マルチタスクのカメラアクセスにより、アプリの切り替えによってスキャンプロセスが中断されることはありません。入口API:isMultitaskingCameraAccessEnabled = true

  • ビデオ通話 + メモ: ビデオ会議アプリケーションにはピクチャー・イン・ピクチャーが統合されており、ユーザーは iPad で会議に参加しながら重要なポイントをメモに記録できます。ピクチャ イン ピクチャ ウィンドウには、常にリモート参加者の画像が表示されます。入口API:AVPictureInPictureController + AVPictureInPictureVideoCallViewController

関連セッション

コメント

GitHub Issues · utterances