WWDC Quick Look 💓 By SwiftGGTeam
Capture high-quality photos using video formats

Capture high-quality photos using video formats

元の動画を見る

ハイライト

iOS 15 では、録画とプレビューの応答性を維持しながら、一般的なビデオ形式で高品質の写真を撮影できるようになります。開発者が使用できるのは、AVCapturePhotoOutput.QualityPrioritizationそしてAVCaptureDevice.Format.isHighPhotoQualitySupported画質と速度のトレードオフを制御します。

主要内容

多くのカメラ アプリは、同じ画面内で 2 つのことを実行します。つまり、ビデオ プレビューを継続的に表示し、ユーザーがボタンを押したときに写真を保存します。

このようなアプリではビデオ形式を選択することがよくあります。このビデオ形式は、録画、ライブ ストリーミング、リアルタイム フィルター、AR シーンに適しています。オーバーヘッドが低く、フレーム レートは 60 fps に達することができ、開発者はビデオ処理により適した解像度を得ることができます。

問題は写真を撮る瞬間にあります。以前は、ビデオ形式ではスムーズなプレビューを確保するために、より軽い写真処理が使用されていました。写真はすぐに配信されますが、低光量、ノイズ、ダイナミック レンジは写真形式ほどよく表現されません。

プロの写真アプリは、写真形式に切り替えたり、最高の解像度を取得したり、Live Photo や ProRAW などの写真機能を使用したりできます。ソーシャルネットワーキング、ライブストリーミング、ARアプリではこれを行うのは困難です。プレビューでフレームをドロップさせずにビデオ フレームの処理を続行する必要があります。

Apple は、iOS 15 で一般的なビデオ形式の写真処理アルゴリズムを改善しました。開発者は引き続きビデオ形式を使用し、.balancedビデオの録画やプレビューを中断することなく、大幅に優れた写真を撮影できます。最高の品質が必要な場合に選択してください.qualityただし、一部のデバイスではフレームのドロップやプレビューの中断が発生する可能性があります。

このプレゼンテーションの鍵となるのは 2 つのスイッチです。 1 つは品質優先です。AVCapturePhotoOutput今回の撮影ではスピードか画質のどちらかが重要でした。もう 1 つは、新しい高品質写真機能をサポートするビデオ形式を開発者に伝える形式機能クエリです。

詳細

写真キャプチャ パイプラインを構築する

(01:19) AVCapture (オーディオおよびビデオ キャプチャ) 写真の基本構造は変わっていません。アプリケーションの作成AVCaptureSession、カメラを次のように使用しますAVCaptureDevice、次に使用しますAVCaptureDeviceInputカメラをセッションに接続し、最後に追加しますAVCapturePhotoOutput写真を受信します。

import AVFoundation

final class PhotoCaptureController: NSObject, AVCapturePhotoCaptureDelegate {
    private let session = AVCaptureSession()
    private let photoOutput = AVCapturePhotoOutput()

    func configure() throws {
        session.beginConfiguration()
        session.sessionPreset = .photo

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

        let input = try AVCaptureDeviceInput(device: device)

        if session.canAddInput(input) {
            session.addInput(input)
        }

        if session.canAddOutput(photoOutput) {
            session.addOutput(photoOutput)
        }

        session.commitConfiguration()
    }

    func capture() {
        let settings = AVCapturePhotoSettings()
        photoOutput.capturePhoto(with: settings, delegate: self)
    }
}

キーポイント:

  • AVCaptureSessionこれは取得マップの中心であり、入力と出力の両方がそれに接続されています。
  • session.sessionPreset = .photoこの設定では写真のキャプチャが優先されることを示します。
  • AVCaptureDevice.default(..., for: .video, ...)リア広角カメラを入手してください。
  • AVCaptureDeviceInputカメラデータをセッションに送信します。
  • AVCapturePhotoOutput写真出力ポートです。
  • AVCapturePhotoSettings()1 枚の写真の設定を保存します。
  • capturePhoto(with:delegate:)射撃を開始すると結果は合格しますAVCapturePhotoCaptureDelegateコールバック配信。

品質優先順位を使用してトレードオフを表現する

(03:07) これまで、開発者はisAutoStillImageStabilizationEnabledに設定trueさらなる写真クオリティの追求。この名前は静止画の手ぶれ補正のみを表します。今日の写真の品質は、Smart HDR や Deep Fusion などのマルチ画像融合テクノロジーからもたらされています。 iOS 13の導入AVCapturePhotoOutput.QualityPrioritization、3 つのレベルを使用してトレードオフを表現します。.speed.balanced.quality

import AVFoundation

final class PrioritizedPhotoCapture: NSObject, AVCapturePhotoCaptureDelegate {
    private let photoOutput = AVCapturePhotoOutput()

    func configurePhotoOutput() {
        photoOutput.maxPhotoQualityPrioritization = .quality
    }

    func captureForFastSharing() {
        let settings = AVCapturePhotoSettings()
        settings.photoQualityPrioritization = .balanced
        photoOutput.capturePhoto(with: settings, delegate: self)
    }

    func captureForBurstLikeSpeed() {
        let settings = AVCapturePhotoSettings()
        settings.photoQualityPrioritization = .speed
        photoOutput.capturePhoto(with: settings, delegate: self)
    }
}

キーポイント:

  • maxPhotoQualityPrioritizationこれを設定しますAVCapturePhotoOutput許可される最高の品質レベル。
  • この値は、出力を構成するときに 1 回設定できます。
  • settings.photoQualityPrioritization = .balanced1回の撮影における速度と画質のバランスを示します。
  • settings.photoQualityPrioritization = .speedこの撮影では迅速な配信が優先されていることを示します。
  • 単一のショットにこれより高い優先度を設定することはできません。photoOutput.maxPhotoQualityPrioritizationそうでない場合は、例外がスローされます。
  • 設定されていない場合、デフォルト値は次のとおりです。.balanced

処理時間に基づいて UI フィードバックを決定する

(04:29) 品質優先は単なるヒントです。AVCapturePhotoOutputデバイス、シーン、照明の選択アルゴリズムが組み合わされます。開発者は基礎となるアルゴリズムを直接指定することはできませんが、それを読み取ることはできます。AVCaptureResolvedPhotoSettings.photoProcessingTimeRange、写真の配信にかかる時間を決定します。

import AVFoundation

func shouldShowProcessingIndicator(
    for resolvedSettings: AVCaptureResolvedPhotoSettings
) -> Bool {
    let processingRange = resolvedSettings.photoProcessingTimeRange
    return processingRange.end.seconds > 0.5
}

キーポイント:

  • AVCaptureResolvedPhotoSettingsシステム解析後のカメラ設定です。
  • photoProcessingTimeRange写真の処理時間範囲を示します。
  • processingRange.end.seconds可能な限りゆっくりとした時間をかけてください。
  • アプリは、しきい値を超えたときに待機インジケーターを表示できます。 ・この判断は妥当である.quality高品質の処理には時間がかかる場合があるため、撮影してください。

写真形式とビデオ形式を区別する

(06:56) 写真形式は、アプリが静止画を最初に配置することを意味します。最高の写真解像度を持ち、Live Photo、ProRAW などの写真機能をサポートし、フレーム レートは 30 fps に制限されています。ビデオ形式は、アプリケーションがビデオ エクスペリエンスを中心に設計されており、録画、ライブ ストリーミング、リアルタイム処理、60 fps に適していることを示しています。

import AVFoundation

func configureSessionForPhotoFirst(_ session: AVCaptureSession) {
    session.beginConfiguration()
    session.sessionPreset = .photo
    session.commitConfiguration()
}

func selectPhotoFormat(from device: AVCaptureDevice) -> AVCaptureDevice.Format? {
    return device.formats.first { format in
        format.isHighestPhotoQualitySupported
    }
}

func selectVideoFormat(from device: AVCaptureDevice) -> AVCaptureDevice.Format? {
    return device.formats.first { format in
        !format.isHighestPhotoQualitySupported
    }
}

キーポイント:

  • .photoプリセットは写真優先のセッション構成を選択します。
  • isHighestPhotoQualitySupported == true形式が写真形式であることを示します。
  • isHighestPhotoQualitySupported == false形式はビデオ形式です。
  • 最高の写真品質を求めるアプリに適した写真形式。
  • ビデオ形式は、安定したプレビュー、録画、またはカスタム フレーム処理を必要とするアプリに適しています。

高品質の写真をサポートするビデオ形式を選択してください

(11:37) iOS 15AVCaptureDevice.Formatに追加されましたisHighPhotoQualitySupported。この属性はtrueこの形式はビデオ形式での高品質の写真機能をサポートしており、ビデオ形式である必要があります。

import AVFoundation

func selectHighPhotoQualityVideoFormat(
    from device: AVCaptureDevice
) -> AVCaptureDevice.Format? {
    return device.formats.first { format in
        format.isHighPhotoQualitySupported
    }
}

func applyHighPhotoQualityVideoFormat(to device: AVCaptureDevice) throws {
    guard let format = selectHighPhotoQualityVideoFormat(from: device) else {
        return
    }

    try device.lockForConfiguration()
    device.activeFormat = format
    device.unlockForConfiguration()
}

キーポイント:

  • isHighPhotoQualitySupportediOS 15で追加された新しいフォーマット機能クエリです。
  • このプロパティは、ビデオ形式が新しい高品質写真処理をサポートするかどうかを示します。
  • device.formats.first { ... }カメラで使用可能なフォーマットから一致するフォーマットを選択します。
  • 改訂activeFormat前に呼び出す必要がありますlockForConfiguration()
  • セットアップ完了後に呼び出されますunlockForConfiguration()設定ロックを解除します。
  • プレゼンテーションに記載されているサポート範囲には、1280×720 30/60 fps、1920×1080 30/60 fps、1920×1440 30 fps、4K 30 fpsが含まれており、デバイスのサポートはiPhone XSまで遡ります。

ビデオ形式で選択します.balancedまたは.quality

(10:19) サポートされているビデオ形式では、.speed軽く処理された WYSIWYG (表示されているものがそのまま得られる) 写真を提供します。.balanced画質が大幅に向上し、処理時間の増加はわずかで、ビデオ録画のフレーム落ちやプレビューの中断は発生しません。.qualityより高価なアルゴリズムが実行されるため、一部のデバイスではフレーム ドロップやプレビューの中断が発生する可能性があります。

import AVFoundation

final class VideoFormatPhotoCapture: NSObject, AVCapturePhotoCaptureDelegate {
    private let photoOutput = AVCapturePhotoOutput()

    func configureOutputForVideoFormat() {
        photoOutput.maxPhotoQualityPrioritization = .quality
    }

    func captureSnapshotDuringRecording(needsExactVideoMatch: Bool) {
        let settings = AVCapturePhotoSettings()

        if needsExactVideoMatch {
            settings.photoQualityPrioritization = .speed
        } else {
            settings.photoQualityPrioritization = .balanced
        }

        photoOutput.capturePhoto(with: settings, delegate: self)
    }
}

キーポイント:

  • maxPhotoQualityPrioritization = .quality後続のショットを最高レベルで選択できるようにします。
  • needsExactVideoMatch写真が同時に録画されたビデオとまったく同じである必要があるかどうかを示します。
  • .speed写真とビデオ画像の一貫性が必要なシーンに適しています。
  • .balancedほとんどのビデオ形式の写真シーンに適しており、録画やプレビューを中断することなく画質を向上させます。
  • 使いたい.qualityより高い画質を得る場合、一部のデバイスではフレーム落ちやプレビューの中断のリスクを受け入れる必要があります。

互換性と制限事項の処理

(12:32) アプリがAVCapturePhotoOutputそして.balanced、iOS 15 ではより優れたビデオ形式の写真が自動的に取得されます。.speedアプリケーションは次のように変更できます.balanced。古いものをまだ使用しているAVCaptureStillImageOutputアプリケーションを移行する必要があります。

import AVFoundation

func preferredPhotoQualityPrioritization(
    prioritizesExactVideoAppearance: Bool,
    acceptsPreviewInterruptions: Bool
) -> AVCapturePhotoOutput.QualityPrioritization {
    if prioritizesExactVideoAppearance {
        return .speed
    }

    if acceptsPreviewInterruptions {
        return .quality
    }

    return .balanced
}

キーポイント:

  • 写真がビデオと同じに見える必要がある場合を選択します.speed
  • プレビューの中断またはフレームのドロップをいつ受け入れるかを選択できます。.quality
  • 通常のビデオ形式で写真を撮影することをお勧めします。.balanced始める。
  • 新しい能力は以下にのみ適用されますAVCaptureSessionには当てはまりませんAVCaptureMultiCamSession
  • AVCaptureStillImageOutputこの新しい機能は非推奨であり、サポートされていません。
  • .balancedそして.quality露出の異なる複数の画像が結合される場合があり、その写真は同時に録画されたビデオとは異なって見える場合があります。

重要ポイント

  • 何をすべきか: ショートビデオアプリに「高品質スクリーンショット」ボタンを追加します。 価値がある理由: iOS 15 のビデオ形式は次のとおりです。.balanced記録やプレビューを中断することなく写真の品質を向上させます。 開始方法: ビデオ形式の使用を続けるには、isHighPhotoQualitySupportedのためにtrueAVCaptureDevice.Format、撮影時に設定settings.photoQualityPrioritization = .balanced

  • 対処方法: ライブ ストリーミング アプリにアンカー カバーのスナップショット機能を追加します。 実行する価値がある理由: ライブ ブロードキャスト リンクには低遅延と安定したプレビューが必要であり、ビデオ形式は写真形式よりもリアルタイム処理に適しています。 開始方法: を使用しますAVCapturePhotoOutputライブセッション中に写真をキャプチャします。デフォルトで使用されます。.balanced、ネットワークが弱い場合、または機器に大きな負荷がかかっている場合に切り替えられます。.speed

  • やるべきこと: AR アプリに入り口を追加して、現在の 3D シーンの写真を保存します。 価値がある理由: AR シーンは安定したカメラ フィードに依存しています。講演では、再アルゴリズムが核となるエクスペリエンスに影響を与える可能性があると指摘しました。.balanced画質と滑らかさの間で制御可能な結果を​​達成できます。 開始方法: 既存のAVCaptureSession追加するAVCapturePhotoOutput、写真を撮る前にお読みくださいphotoProcessingTimeRange、待つ必要がある場合は軽量のプロンプトを表示します。

  • やるべきこと: カメラ アプリの撮影設定を「速度/バランス/品質」にします。 実行する価値がある理由:AVCapturePhotoOutput.QualityPrioritizationこれは、品質と速度をトレードオフする API です。 開始方法: ユーザー選択をマップする.speed.balanced.quality、そして確実にmaxPhotoQualityPrioritizationシングルショット設定以上です。

  • 対処方法: クイック バースト モードとファイン ファイル保持モードを監査または検査アプリに追加します。 実行する価値がある理由: 同じビジネスでも、迅速な記録と、より高品質を必要とする証拠写真の両方が存在します。 開始方法: 素早い連続撮影に使用します.speed、記録保持用の 1 枚のシート.balancedまたは.quality、使用photoProcessingTimeRange処理状況を表示するかどうかを決定します。

関連セッション

コメント

GitHub Issues · utterances