WWDC24:ScreenCaptureKitの新機能(HDRをサポート)
※本サイトは、アフィリエイト広告および広告による収益を得て運営しています。購入により売上の一部が本サイトに還元されることがあります。
Appleが、WWDC24において「ScreenCaptureKitによるHDRコンテンツのキャプチャ」を公開しています。
ScreenCaptureKit を使用すると、アプリケーションはシステム UI エクスペリエンスに統合されます。あなたのアプリは、ストリームコンテンツを選択するための使い慣れた方法を提供するために、組み込みのピッカーを提示することができます。
Presenter オーバーレイを使用して、アプリの画面共有体験を向上できます。また、あなたのアプリが共有している内容のプレビューをシステムUIで見ることができます。
これがSCStreamで、アプリで画面や音声のサンプルを受信するためのオブジェクトです。
画面全体をキャプチャしたり、特定のウィンドウやアプリだけをキャプチャするために使用します。
SCContentFilterを指定することで、何をキャプチャするかをストリームに伝えます。異なる解像度やピクセルフォーマットを指定するなど、ストリームの出力をカスタマイズしたいとします。この場合、SCStreamConfiguration を使用してストリーム出力をカスタマイズします。
ストリームを設定したら、SCStreamOutput を使用して画面と音声のサンプルを受信します。
今年の新機能として、HDRコンテンツをキャプチャできるようになりました。ハイダイナミックレンジ(HDR)は、スタンダードダイナミックレンジ(SDR)と比較して、より幅広い輝度レベルと色を提供します。
HDRは高コントラストを提供し、シャドウとハイライトの両方でより多くの詳細をもたらします。
また、色の範囲も広くなります。
SCStreamが、撮影したコンテンツのHDRを出力するようになったことをお伝えできることを嬉しく思います。
ストリーミングされたHDRコンテンツを受信する人々は、ソースと同じ豊かなディテールを体験することができます。
ストリーミングされたHDRコンテンツを受信する人々は、ソースと同じ豊かなディテールを体験することができます。
アプリでHDRキャプチャを有効にするには、SCStreamConfigurationに新しいプロパティを設定してストリームを構成します。
プロパティではcaptureDynamicRange は ScreenCaptureKit に、SDR または HDR のいずれかで画面コンテンツを出力するように指示します。HDR の場合は、hdrLocalDisplay または hdrCanonicalDisplay に設定します。
ローカルディスプレイを使用する場合、ScreenCaptureKitに対して、HDRコンテンツのキャプチャとレンダリングの両方を同じ画面上で行うことを指示することになります。
カノニカル表示の場合は、他のHDRデバイスと共有するために最適化されたHDRコンテンツをキャプチャすることを意味します。
次に設定するプロパティはpixelFormatです。これは、画像内の各ピクセルの色情報がどのように保存されるかを記述します。
HDRでは、コンポーネントごとに少なくとも10ビットのフォーマットを使用します。ほとんどの状況では、10ビットのYCbCrが最適です。
3つ目のプロパティはcolorSpaceNameで、色の範囲と、それらがデジタル値にどのようにマッピングされるかの伝達関数を記述します。
HDRには、HLGまたはPQ伝達関数が必要で、例えばDisplay P3 PQ色空間があります。
そして最後に、BGRA色空間とYCbCr色空間の間で色を変換するために使用されるcolorMatrixがあり、SCStreamConfigurationをサポートします。
アプリでHDRスクリーン・サンプルを受信するには、スクリーン・タイプの出力を追加します。
そして最後に、HDRサンプルの受信を開始するためにストリームを開始します!さて、あなたのアプリはストリームの代わりにシングルスクリーンショットだけが必要だとしましょう。この場合、SCScreenshotManagerはスクリーンショットAPIを提供します。
そして嬉しいことに、この API を使って HDR でスクリーンショットを撮ることもできます。
SCStream のように、SCScreenshotManager はコンテンツフィルタとストリーム設定を使用します。
そして SCStream と同様に、HDR スクリーンショットを撮るためのプリセットが用意されています。ローカルまたはカノニカルディスプレイ用のHDRスクリーンショットを撮るための推奨プリセット値を示します。
ローカルディスプレイのプリセットを使用してHDRスクリーンショットを撮るコードの例をお見せします。
最初に行うことは、HDRローカル・ディスプレイ用の設定を作成することです。
スクリーンショットにCMSampleBuffersが必要な場合は、captureSampleBuffer関数を使います。
CGImageが望ましい場合は、captureImage関数を使います。
アプリでマイクのサンプルを受信するには、SCStreamOutput を使用します。それでは、マイクの音声をキャプチャするコードを説明します。
まず、SCStream にマイクをキャプチャするように指示するストリーム設定を作成します。captureMicrophone と microphoneCaptureDeviceID プロパティを設定してデフォルトのマイクをキャプチャします。
フィルタと設定を使用して SCStream を作成します。そしてここで、ストリームに新しいマイクタイプの出力を追加します。
キャプチャを開始し、SCStreamOutput の didOutputSampleBuffer 関数を使用してサンプルを受信します。
これであなたのアプリは画面、音声、マイクのすべてのコンテンツをSCStreamから取得できるようになりました。
ストリーム出力を受信する最も一般的な用途の1つは、サンプルをファイルに書き込むことです。
これは SCStream に追加された新しい API を使用することで実現できます。この API を使用すると、アプリ内の画面、音声、マイクの内容を簡単に記録・保存できます。
前と同じように、コンテンツをキャプチャするために SCStream を設定します。この同じストリームを録画にも使います。
録音するには、この新しい出力を追加するだけです。
SCRecordingOutput は SCRecordingOutputConfiguration を使用して設定できます。