WWDC Quick Look 💓 By SwiftGGTeam
Meet ScreenCaptureKit

Meet ScreenCaptureKit

元の動画を見る

ハイライト

ScreenCaptureKit は、Apple が発表した高性能 macOS 画面キャプチャ フレームワークです。ビデオ/オーディオ キャプチャをサポートし、GPU メモリ バッファリング、ハードウェア アクセラレーション、柔軟なコンテンツ フィルタリングなどの機能を備えています。画面共有、ゲームのライブブロードキャスト、ビデオ会議などのシナリオに使用されます。


主要内容

macOS 画面キャプチャの分野には、これまで統一されたソリューションがありませんでした。開発者は、CGDisplayCreateSnapshot() を呼び出してスクリーンショットを撮るか、AVFoundation を使用して画面を記録することができます。前者はパフォーマンスが制限されており、後者は機能が複雑すぎます。さらに重要なのは、これらのソリューションには「何をキャプチャするか」についてのきめ細かい制御が欠けており、アプリ ウィンドウを簡単に除外したり、ディスプレイの一部だけをキャプチャしたり、同時に音声を処理したりすることができません。 (00:30)

ScreenCaptureKit はこのギャップを埋めます。これは画面キャプチャ用に特別に設計されたフレームワークであり、プロセス全体をカバーする 4 つのコア オブジェクトを備えています。SCShareableContentキャプチャ可能なコンテンツを取得し、SCContentFilter何をキャプチャするかを定義し、SCStreamConfiguration出力パラメータを構成します。SCStreamデータのキャプチャと配信を実行します。 (02:15)

典型的なアプリケーション シナリオは画面共有です。ユーザーがZoomで「画面共有」をクリックすると、アプリはウィンドウセレクターを表示し、Zoom自身のウィンドウを除外し(それ以外の場合は「無限ミラーリング」)、選択したコンテンツを適切な解像度とフレームレートでキャプチャし、システムオーディオを同期処理する必要があります。以前は複数の API を組み合わせる必要がありましたが、ScreenCaptureKit では 1 つの API ですべてを処理できるようになりました。 (04:40)

もう 1 つのシナリオは、ゲームのライブ ストリーミングです。ゲーム開発者は、ライブ ストリーミング ソフトウェア独自の UI のキャプチャを避けながら、1080p 60fps でゲームプレイ映像をキャプチャしたいと考えています。 ScreenCaptureKit のコンテンツ フィルタリング メカニズムは、「このウィンドウのみを含めて他のすべてを除外する」ように正確に行うことができ、出力解像度は元のウィンドウから切り離されます。ゲーム ウィンドウ 4K は 1080p ストリームも出力できます。 (08:10)


詳細

キャプチャ可能なコンテンツを取得する

(06:53) 最初のステップは、現在システムで利用可能なディスプレイ、アプリ、ウィンドウを取得することです。SCShareableContent.excludingDesktopWindows()キャプチャ可能なすべてのコンテンツを含むオブジェクトを返します。

// キャプチャ可能なコンテンツを取得
let content = try await SCShareableContent.excludingDesktopWindows(
    false,
    onScreenWindowsOnly: true
)

キーポイント:

  • excludingDesktopWindows: falseデスクトップの壁紙を含むウィンドウを表します
  • onScreenWindowsOnly: true表示されているウィンドウのみが返され、最小化されたウィンドウは除外されます
  • content.applicationsキャプチャ可能なすべてのアプリの配列です
  • content.displaysすべてのディスプレイの配列です
  • この呼び出しでは、ユーザーが「画面録画」権限を承認する必要があります。

コンテンツフィルターを作成する

(08:32) キャプチャできるものがすべて揃ったら、次のステップは「何をキャプチャしたいのか」を定義することです。SCContentFilter は 3 つのモードをサポートします:

ディスプレイによるフィルター: ディスプレイ全体をキャプチャするか、特定のアプリ ウィンドウを除外します。

let excludedApps = content.applications.filter { app in
    Bundle.main.bundleIdentifier == app.bundleIdentifier
}

filter = SCContentFilter(display: display,
                         excludingApplications: excludedApps,
                         exceptingWindows: [])

キーポイント:

  • display: display はディスプレイ全体をキャプチャします
  • excludingApplications指定したアプリのすべてのウィンドウを除外します
  • exceptingWindows特定のウィンドウをさらに除外することもできます
  • これは画面共有ソフトウェアの典型的な使用法です - 「無限ミラーリング」を避けるために独自のウィンドウを除外します

単一ウィンドウによるフィルター: モニターの境界に関係なく、1 つのウィンドウのみをキャプチャします。上級セッション (10155) では、このパターンについて詳しく説明します。

ウィンドウ リストによるフィルター: 複数のウィンドウを同時にキャプチャし、他のすべてを除外します。マルチウィンドウのコラボレーションシナリオに適しています。

フローパラメータを構成する

10:23SCStreamConfiguration制御出力フォーマット:

let streamConfig = SCStreamConfiguration()

// 出力解像度 1080p
streamConfig.width = 1920
streamConfig.height = 1080

// 60fps でキャプチャ
streamConfig.minimumFrameInterval = CMTime(value: 1, timescale: CMTimeScale(60))

// マウスカーソルを非表示
streamConfig.showsCursor = false

// オーディオキャプチャを有効化
streamConfig.capturesAudio = true

// 48kHz 立体声
streamConfig.sampleRate = 48000
streamConfig.channelCount = 2

キーポイント:

  • 解像度は元のコンテンツのサイズに依存せず、ScreenCaptureKit は自動的にスケーリングします。
  • minimumFrameInterval固定フレーム レートではなくフレーム レートを制御します - システムはコンテンツの変化に応じて動的に調整します
  • 音声キャプチャには別のユーザー認証が必要です
  • デフォルトのピクセル形式は BGRA であり、渡すことができます。pixelFormatプロパティの変更

キャプチャストリームの開始

(11:46) 設定が完了したら、SCStreamそしてキャプチャを開始します:

// キャプチャストリームを作成
stream = SCStream(filter: filter, configuration: streamConfig, delegate: self)

// キャプチャを開始
try await stream?.startCapture()

// エラー処理用 delegate
func stream(_ stream: SCStream, didStopWithError error: Error) {
    DispatchQueue.main.async {
        self.logger.error("Stream stopped with error: \(error.localizedDescription)")
        self.error = error
        self.isRecording = false
   }
}

キーポイント:

  • startCapture()これは非同期呼び出しであり、待機が必要です
  • ストリームエラーと状態変更を処理するにはデリゲートを提供する必要があります
  • 一般的なエラーには、ユーザーによる権限の取り消し、システム リソースの不足、構成パラメータの競合などがあります。
  • 通話のキャプチャを停止するstream?.stopCapture()

メディアデータの受信

(13:07) 実装SCStreamOutputプロトコルはデータを受信します。

func stream(_ stream: SCStream, didOutputSampleBuffer sampleBuffer: CMSampleBuffer, of type: SCStreamOutputType) {
    switch type {
    case .screen:
        handleLatestScreenSample(sampleBuffer)
    case .audio:
        handleLatestAudioSample(sampleBuffer)
    }
}

// 添加输出
try stream?.addStreamOutput(self, type: .screen, sampleHandlerQueue: screenFrameOutputQueue)
try stream?.addStreamOutput(self, type: .audio, sampleHandlerQueue: audioFrameOutputQueue)

キーポイント:

  • SCStreamOutputType.screenそして.audio映像と音声にそれぞれ対応
  • sampleHandlerQueueコールバック キューを指定します。メイン スレッドのブロックを避けるために、専用のシリアル キューを使用することをお勧めします。
  • CMSampleBufferAVFoundation の標準タイプであり、エンコード、ストリーミング、録画に直接使用できます。
  • 画面データはBGRAピクセル形式、音声はPCMデータです。

重要ポイント

  • やるべきこと: macOS アプリに画面共有機能を追加します。 実行する価値がある理由: ScreenCaptureKit は、Apple が推奨する画面キャプチャ ソリューションであり、従来の API よりも優れたパフォーマンスとキャプチャされたコンテンツの正確な制御を備えています。ビデオ会議、リモート コラボレーション、ライブ ブロードキャスト ツールはすべて、この機能に依存しています。 開始方法:からSCShareableContent.excludingDesktopWindows()キャプチャ可能なコンテンツを取得し、それ自体を除外するウィンドウを作成しますSCContentFilter、1080p 30fps 出力を構成し、開始しますSCStreamそして、SCStreamOutputプロセスデータ。

  • 内容: ゲーム記録ツールを構築します。 価値がある理由: ゲーマーは高フレームレートの映像を録画する必要があります。 ScreenCaptureKit は、元のウィンドウに関係なく出力解像度をサポートします。ゲームの 4K 解像度は 1080p 60fps ストリームを出力することもできるため、エンコード圧力が軽減されます。 開始方法: ウィンドウ モードで作成しますSCContentFilter.desktopIndependentWindow、 構成minimumFrameInterval60fpsの場合、width/height1080p に設定し、ハードウェア エンコーダーを使用してストリーミングします。

  • やるべきこと: マルチウィンドウの共同作業用ホワイトボードを作成します。 実行する価値がある理由: コラボレーション シナリオでは、複数のウィンドウを同時にキャプチャする必要がありますが、無関係な干渉を排除する必要があります。 ScreenCaptureKit のウィンドウ リスト フィルター モードは、キャプチャされる内容を正確に制御します。 開始方法: を使用しますSCContentFilter.init(independentWindows:)複数のターゲット ウィンドウ、オーディオ キャプチャを false に設定 (ホワイトボードにサウンドは必要ありません)、およびユーザーのモニターに合わせた出力解像度を使用してフィルターを作成します。

  • 機能: 教育注釈を含む画面録画を作成するためのツール。 実行する価値がある理由: ScreenCaptureKit は画面をキャプチャするだけでなく、インテリジェントなエンコードと注釈の追跡のために各フレームのダーティ レククト (変更領域) も提供します。アドバンスト セッション (10155) では、フレーム メタデータの適用について詳しく説明します。 開始方法: ストリーミングを開始してから聞いてくださいSCStreamDelegatedidUpdateConfigurations構成変更からダーティ Rect 情報を取得するためのコールバック。


関連セッション

  • Take ScreenCaptureKit to the next level — discover how you can support complex screen capture experiences for people using your app with screencapturekit. we’ll explore many of the advanced options you can incorporate including fine tuning content filters, frame metadata interpretation, window pickers, and more.
  • Create camera extensions with Core Media IO — discover how you can use core media io to easily create macos system extensions for software cameras, hardware cameras, and creative cameras.
  • Create a more responsive media app — discover how you can use avfoundation to keep people focused on your media app’s content — not your loading spinner.
  • What’s new in AVCapture — discover the latest enhancements to avcapture and how they can help you build better camera experiences in your apps.
  • Advances in ProRes and other codecs — learn about the latest updates to prores and other video codecs on apple platforms.

コメント

GitHub Issues · utterances