WWDC Quick Look 💓 By SwiftGGTeam
What's new in camera capture

What's new in camera capture

元の動画を見る

ハイライト

iOS 15 では、カメラ キャプチャに 5 つのアップグレードが加えられています: 最小焦点距離レポート、10 ビット HDR ビデオ、コントロール センター ビデオ エフェクト (センター ステージ / ポートレート / マイク モード)、パフォーマンス最適化のベスト プラクティス、および IOSurface 圧縮。

主な内容

20mm QR コードをスキャンするために、ユーザーが携帯電話を非常に近づけたため、コードがぼやけてしまいました。これは、携帯電話のレンズの最短撮影距離が限られているためです。近づきすぎるとピントが合いません。iOS 15 が登場する前は、開発者はこの距離がどのようなものかを知らず、推測することしかできませんでした。今AVCaptureDevice公開されましたminimumFocusDistance属性に基づいて、アプリは必要なズーム率を自動的に計算し、ユーザーが適切な距離まで後退するようにガイドします。

(02:17) もう 1 つの大きな機能は 10 ビット HDR ビデオです。iPhone 12 でサポートされており、x420 ピクセル形式 (10 ビット YUV) を使用し、HLG 曲線と BT.2020 色域に一致し、EDR ハイライト回復機能が組み込まれています。さらに、Apple は Dolby Vision メタデータをすべてのフレームに自動的に挿入し、記録されたビデオは Dolby Vision ディスプレイ デバイスと直接互換性があります。

(12:14) このシーンの主役は、コントロール センターのビデオ エフェクトです。センターステージ、ポートレートモード、マイクモードはシステムレベルの機能です。ユーザーがビデオ通話アプリを開いた後は、開発者がコードを記述しなくても、すべてのビデオ通話アプリが自動的に有効になります。ただし、Apple は、アプリが状態を検出し、UI をカスタマイズし、アプリ内の他の機能と連携できるようにする API も提供しています。

Center Stage は、M1 iPad Pro の 12 メガピクセルの超広角フロント カメラを使用して、フレーム内の人物を自動的に追跡し、常に構図を維持します。ポートレート モードでは、ニューラル エンジンを使用して単眼深度マップを生成し、大口径レンズの浅い被写界深度効果をシミュレートします。マイク モードには、標準、Voice Isolation (ノイズ低減)、および Wide Spectrum (環境音保護) の 3 つがあります。

(30:43) 最後に、iOS 15 では、ロスレスのインメモリビデオ圧縮形式である IOSurface 圧縮が導入されました。iPhone 12シリーズ、2020年秋iPad Air、M1 iPad Proに対応。アプリが Metal や Core Image などのハードウェア アクセラレーション パイプラインを使用している場合、圧縮をオンにするとメモリ帯域幅の使用量を大幅に削減できます。

##詳細

QRコードの読み取り距離を自動計算

let deviceFieldOfView = self.videoDeviceInput.device.activeFormat.videoFieldOfView

let minSubjectDistance = minSubjectDistanceForCode(
    fieldOfView: deviceFieldOfView,
    minimumCodeSize: 20,
    previewFillPercentage: Float(rectOfInterestWidth)
)

private func minSubjectDistance(
    fieldOfView: Float,
    minimumCodeSize: Float,
    previewFillPercentage: Float
) -> Float {
    let radians = degreesToRadians(fieldOfView / 2)
    let filledCodeSize = minimumCodeSize / previewFillPercentage
    return filledCodeSize / tan(radians)
}

キーポイント:

  • videoFieldOfViewカメラの現在のフォーマットの水平視野です。
  • minimumCodeSizeスキャンする最小コード サイズ (ミリメートル単位)
  • previewFillPercentageプレビュー画面でコードが占める幅の割合です。
  • 計算済みminSubjectDistanceコードが明確に焦点を合わせることができる最小距離です

距離が近すぎる場合は自動的にズームします

let deviceMinimumFocusDistance = Float(self.videoDeviceInput.device.minimumFocusDistance)

if minimumSubjectDistanceForCode < deviceMinimumFocusDistance {
    let zoomFactor = deviceMinimumFocusDistance / minimumSubjectDistanceForCode
    do {
        try videoDeviceInput.device.lockForConfiguration()
        videoDeviceInput.device.videoZoomFactor = CGFloat(zoomFactor)
        videoDeviceInput.device.unlockForConfiguration()
    } catch {
        print("Could not lock for configuration: \(error)")
    }
}

キーポイント:

  • minimumFocusDistanceiOS 15 の新しい属性です。単位はメートルです
  • ターゲット距離が最小焦点距離より小さい場合、ユーザーが後退できるようにズーム倍率を計算します。
  • 最初に行う必要がありますlockForConfiguration()変更するvideoZoomFactor
  • iPhone 12 Pro Max広角レンズの最短撮影距離は15cm、iPhone 12 Proは12cmです。

10 ビット HDR ビデオ形式を有効にする

func firstTenBitFormatOfDevice(device: AVCaptureDevice) -> AVCaptureDevice.Format? {
    for format in device.formats {
        let pixelFormat = CMFormatDescriptionGetMediaSubType(format.formatDescription)

        if pixelFormat == kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange /* 'x420' */ {
            return format
        }
    }
    return nil
}

// 设置为活动格式
if let tenBitFormat = firstTenBitFormatOfDevice(device: videoDevice) {
    do {
        try videoDevice.lockForConfiguration()
        videoDevice.activeFormat = tenBitFormat
        videoDevice.unlockForConfiguration()
    } catch {
        print("Could not set format: \(error)")
    }
}

キーポイント:

  • x420 フォーマットは 10 ビット バイプラナー YUV、ビデオ範囲 (16 ~ 235)
  • iPhone 12のフォーマット一覧では、各解像度とフレームレートが420v、420f、x420の3つのフォーマットに対応しています
  • 10 ビット HDR ビデオは 720p、1080p、4K および 1920x1440 (4:3) をサポートします。
  • Apple は、Dolby Vision ディスプレイ デバイスとの互換性のために、Dolby Vision メタデータを自動的に挿入します。

コントロールセンターのビデオエフェクトステータスを検出

// Center Stage
let isCenterStageEnabled = AVCaptureDevice.isCenterStageEnabled
let isCenterStageActive = videoDevice.isCenterStageActive

// Portrait
let isPortraitActive = videoDevice.isPortraitEffectActive

// Mic Mode
let preferredMicMode = AVCaptureDevice.preferredMicrophoneMode
let activeMicMode = AVCaptureDevice.activeMicrophoneMode

キーポイント:

  • isCenterStageEnabledコントロールセンターのアプリの切り替えステータスを反映するクラス属性です。
  • isCenterStageActive現在のカメラが Center Stage を適用しているかどうかを示すインスタンス属性です。
  • Center Stage の制限: 最大 30fps、最大出力解像度 1920x1440、ズームは 1x にロック
  • ポートレートモードの制限: 最大 30fps、最大解像度 1920x1440、フロントカメラのみ

協力モードのコントロールセンターステージ

// 设置为 cooperative 模式,App 和 Control Center 都能控制
do {
    try videoDevice.lockForConfiguration()
    videoDevice.centerStageControlMode = .cooperative
    videoDevice.isCenterStageEnabled = true
    videoDevice.unlockForConfiguration()
} catch {
    print("Could not configure Center Stage: \(error)")
}

// 监听状态变化,保持 UI 同步
videoDevice.addObserver(self, forKeyPath: "isCenterStageEnabled", options: .new, context: nil)

キーポイント:

  • .userモード (デフォルト): ユーザーのみがコントロール センターで切り替えることができ、アプリが変更しようとすると例外がスローされます。
  • .appモード: アプリのみが制御可能、コントロールセンターがグレーになり、非推奨
  • .cooperativeモード: アプリとコントロール センターの両方で制御でき、監視ステータスの同期を保つ必要があります。
  • FaceTime は協調モードの典型的な使用例です

ドロップされたフレームを処理する

func captureOutput(
    _ output: AVCaptureOutput,
    didDrop sampleBuffer: CMSampleBuffer,
    from connection: AVCaptureConnection
) {
    guard let attachment = sampleBuffer.attachments[.droppedFrameReason],
          let reason = attachment.value as? String else { return }

    switch reason as CFString {
    case kCMSampleBufferDroppedFrameReason_FrameWasLate:
        // 处理太慢,考虑降低帧率或减少工作量
        reduceFrameRate()
    case kCMSampleBufferDroppedFrameReason_OutOfBuffer:
        // 缓冲区不足,检查是否持有过多 buffer
        releaseHeldBuffers()
    case kCMSampleBufferDroppedFrameReason_Discontinuity:
        // 系统级问题,非 App 原因
        break
    default:
        fatalError("A frame dropped for an undefined reason.")
    }
}

キーポイント:

  • alwaysDiscardsLateVideoFramesデフォルトは true で、最新のフレームを保持し、古いフレームを破棄します。
  • すべてのフレームを記録する必要がある場合 (AVAssetWriter など)、false に設定してリアルタイムのパフォーマンスを自分で確保する必要があります。
  • FrameWasLate最も一般的な理由は動的削減ですactiveMinVideoFrameDuration軽減できる
  • OutOfBufferこれは、アプリが保持しているバッファが多すぎるため、時間内に解放する必要があることを意味します。

IOSurface 圧縮を有効にする

let videoDataOutput = AVCaptureVideoDataOutput()

// 检查是否支持压缩 BGRA
let compressedFormat = kCVPixelFormatType_Lossless_420YpCbCr10BiPlanarVideoRange

if videoDataOutput.availableVideoPixelFormatTypes.contains(compressedFormat) {
    videoDataOutput.videoSettings = [
        kCVPixelBufferPixelFormatTypeKey as String: compressedFormat
    ]
} else {
    // 回退到未压缩格式
    videoDataOutput.videoSettings = [
        kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA
    ]
}

キーポイント:

  • IOSurface 圧縮はロスレスであり、420v、420f、x420、BGRA の圧縮バリアントをサポートしています
  • データがハードウェア パイプライン (Metal、Core Image、AVAssetWriter) で完全に処理された場合にのみ有効です。
  • 圧縮されたサーフェスの読み取りおよび書き込みに CPU を使用しないでください。物理メモリのレイアウトは不透明であり、変更される可能性があります。
  • iPhone 12 シリーズ、2020 iPad Air、M1 iPad Pro はこの機能をサポートしています

重要ポイント

  1. インテリジェントな QR コード スキャン アシスタント
  • 対処方法: QR コード スキャン アプリは QR コードのサイズを自動的に検出し、自動的にズームインし、距離が近すぎる場合はユーザーに戻るよう促します。
  • 実行する価値がある理由:minimumFocusDistanceQR コードのスキャン体験を「近づいて試してみる」から「自動適応」に変えましょう
  • 開始方法: コード サイズと視野角に基づいて最小距離を計算し、minimumFocusDistance比較、自動設定videoZoomFactor
  1. プロ仕様のビデオ録画ツール
  • 内容: カメラ アプリは、10 ビット HDR ビデオ録画と Dolby Vision 互換ファイルへの直接出力をサポートしています。
  • 価値がある理由: Apple は Dolby Vision メタデータを自動的に処理するため、開発者は x420 フォーマットを選択するだけで済みます。
  • 開始方法: トラバーサルdevice.formatsx420 形式を見つけて activeFormat に設定し、使用します。AVCaptureMovieFileOutputまたはAVAssetWriter記録
  1. ビデオ会議効果コントロール パネル
  • やるべきこと: コントロール センターのステータスと同期して、アプリ内でセンター ステージ モードとポートレート モードのスイッチを提供します。
  • 実行する価値がある理由: 協調モードにより、ユーザーはシステム レベルでの制御とアプリ内での迅速な切り替えの両方が可能になります
  • 開始方法: 設定centerStageControlMode = .cooperative、モニターisCenterStageEnabledUI の現在の状態を反映して変更されます。
  1. マルチカメラライブストリーミング
  • 対処法: ピクチャー・イン・ピクチャーのライブ ブロードキャストにはフロント カメラとリア カメラを同時に使用し、IOSurface 圧縮を使用してメモリ使用量を削減します。
  • 実行する価値がある理由: マルチカメラ セッションのメモリ帯域幅には大きな圧力がかかっており、圧縮されたサーフェスは Metal パイプラインでゼロ コピーで処理されます。
  • 開始方法: 設定AVCaptureMultiCamSession, VideoDataOutput は圧縮ピクセル形式を使用し、Metal シェーダーは圧縮されたサーフェスを直接読み取って合成します。
  1. アダプティブフレームレートカメラ
  • 内容: カメラ アプリは、システムのストレス状態に基づいてフレーム レートを動的に調整し、過熱やフレーム落ちを回避します。
  • 実行する価値がある理由:systemPressureStateNominal/Fair/Serious/Critical/Shutdownの5段階のステータスを提供し、事前に対策を講じることができます
  • 開始方法: モニタリングsystemPressureState変化、深刻レベル低下activeMinVideoFrameDuration、重要な場合は不要な機能をオフにする

関連セッション

コメント

GitHub Issues · utterances