大多数浏览器和
Developer App 均支持流媒体播放。
-
使用 ScreenCaptureKit 拍摄 HDR 内容
了解如何使用 ScreenCaptureKit 捕获高动态范围的色彩,并探索 HDR 支持、麦克风采集和直接录制到文件等新功能。
章节
- 0:00 - Introduction and ScreenCaptureKit recap
- 1:20 - Capture HDR content
- 7:14 - Add microphone output
- 8:41 - Record to file
资源
相关视频
WWDC24
WWDC23
WWDC22
-
下载
大家好 欢迎观看 我叫 Ben 我是 ScreenCaptureKit 团队 的软件工程师 人们日常使用 ScreenCaptureKit 在视频电话会议中共享屏幕 与世界各地的用户 共享高质量流媒体内容 截屏 支持远程桌面应用程序 使用 ScreenCaptureKit 时 你的 App 将会与 系统 UI 体验集成 你的 App 可以呈现内置选择器 提供熟悉的方式 来选择流媒体内容
可以使用演讲者前置 进一步增强 App 的屏幕共享体验 用户可以在系统 UI 中预览 你的 App 分享的内容 我将展示一些 ScreenCaptureKit 帮助你 在 App 中构建相同体验的新方式 假设你的 App 有流媒体功能 现在你将能够捕获 HDR 格式的流和截屏 也许你的 App 目前可以 捕获屏幕和音频内容 我将展示如何从提供 屏幕和音频样本的流 获取麦克风输出
如果你的 App 使用录制的屏幕内容 你一定会有兴趣了解 便捷的录制 API ScreenCaptureKit 会为你处理 所有媒体资源编写细节
要了解如何捕获 HDR 内容 首先我们来熟悉 捕获屏幕和音频的基础组件
这是 SCStream 它是你用于 在 App 中接收屏幕 和音频样本的对象 使用它来截取整个屏幕 或特定窗口和 App
通过向流提供 SCContentFilter 来告诉流要捕获的内容 假设你想要自定义流的输出 例如指定其他分辨率或像素格式 为此 使用 SCStreamConfiguration 来自定义流输出
流设置好后 你将能够通过使用 SCStreamOutput 收到屏幕和音频样本
这些是用于截取内容的基本要素 要了解更多详细信息 请观看 之前的 ScreenCaptureKit 视频
今年新推出了 截取 HDR 内容的功能 HDR 也就是高动态范围 能够提供更大的 亮度级别和颜色范围 这是相较于 标准动态范围 (SDR) 而言 HDR 支持高对比度 因此能够提供更多的 阴影和高光细节
它还提供更大的颜色范围
我很高兴地告诉大家 SCStream 现在可输出高动态范围格式 的捕获内容 接收流式传输 HDR 内容的用户 现在可获得与源内容 同样丰富的细节
要在 App 中启用 HDR 捕获 你将需要配置流 即在 SCStreamConfiguration 上 设置一些新属性 这些是需要设置的属性
captureDynamicRange 告诉 ScreenCaptureKit 输出 SDR 或 HDR 格式的屏幕内容 对于 HDR 设置为 hdrLocalDisplay 或 hdrCanonicalDisplay 等一下 本地显示和标准显示是什么意思
当你使用本地显示时 你是在告诉 ScreenCaptureKit 在同一块屏幕上捕获和渲染 HDR 内容
标准显示则表示捕获的 HDR 内容 针对与其他 HDR 设备共享 进行了优化
要配置的下一个属性 是 pixelFormat 它描述了图像中每个像素的 颜色信息是如何存储的
对于 HDR 你将使用每个 组件至少有 10 位的格式 在大多数情况下 10 位 YCbCr 是最佳选择
第三个属性是 colorSpaceName 它描述了颜色的范围 以及用于将颜色映射到 数字值的转换函数 HDR 需要 HLG 或 PQ 转换函数 例如 Display P3 PQ 色彩空间
最后是 colorMatrix 它用于在 BGRA 和 YCbCr 色彩空间之间转换颜色 如果这听起来有点复杂 不用担心 因为 SCStreamConfiguration 可以帮助你 它提供了两种方便的 HDR 预设 captureHDRStreamLocalDisplay 和 captureHDRStreamCanonicalDisplay
如果捕获的 HDR 内容 的目标是本地显示 请使用“本地显示”预设 这一配置将预填充这里显示的值
如果 HDR 内容的目标是其他显示 请使用“标准显示”预设 这一预设的值在这里列出 如果你的 App 需要不同的 输出设置 你可以更改任何这些属性 以满足你的 App 的需求 我们来看一个代码示例 它使用预设来捕获 HDR 内容
首先使用 SCShareableContent 来获取可用内容的列表
这里会捕获整个显示屏画面 因此创建一个 SCContentFilter 用于捕获整个显示屏画面 使用新的预设 API 获取 HDR 标准显示 的配置
并使用过滤器和配置 来创建 SCStream
为了在 App 中接收 HDR 屏幕样本 添加一个类型为 screen 的输出
最后 启动流 开始接收 HDR 样本 现在假设你的 App 只需要 单张截屏而不是一个流 为此 SCScreenshotManager 提供了一个截屏 API 我很高兴地告诉大家 你还可以利用这个 API 获取 HDR 格式的截屏
和 SCStream 一样 SCScreenshotManager 使用内容过滤器和流配置 并且和 SCStream 一样 提供可用于获取 HDR 截屏的预设 这些是用于获取 HDR 截屏 的推荐预设值 分别适用于本地显示或标准显示
我现在将展示一个代码示例 它使用本地显示预设 来获取 HDR 截屏
首先要做的是创建 HDR 本地显示的配置 如果你的 App 需要为截屏 使用 CMSampleBuffers 请使用 captureSampleBuffer 函数
如果更喜欢 CGImage 则使用 captureImage 函数
以上就是使用新 API 从流和截屏获取 惊艳的 HDR 内容的方式 如果你想进一步了解 如何在 App 中使用 HDR 请观看这些视频 了解如何 支持 HDR 图像和媒体 这样 你就可开始使用 ScreenCaptureKit 捕获 HDR 图像和视频了 今年 在精美的 HDR 流中 除了系统音频 你还可以录制麦克风 通过在流中提供新的麦克风输出 你的 App 现在可以捕获 三种类型的媒体内容: 屏幕 系统音频 和麦克风
为了让你的 App 在流中 捕获麦克风音频 SCStreamConfiguration 提供两个新属性 captureMicrophone 可让 App 开启麦克风捕获 microphoneCaptureDeviceID 可让你选择要捕获的麦克风设备
为了在 App 中接收麦克风样本 你将使用 SCStreamOutput 我们来看看用于捕获 麦克风音频的一些代码 你将首先创建一个流配置 告诉 SCStream 要捕获麦克风 设置 captureMicrophone 和 microphoneCaptureDeviceID 属性 以捕获默认麦克风 使用过滤器和配置 来创建 SCStream 在这里你添加一个流输出 具有新的麦克风类型 现在 启动捕获并使用 SCStreamOutput 的 didOutputSampleBuffer 函数来接收样本 如此即可 你的 App 现在可从 SCStream 获取所有屏幕、音频和麦克风内容 接收流输出最常见的用途之一 是将样本写入文件 现在你可以使用一个新的 API 来实现这一点 这个 API 已添加到 SCStream 使用这个 API 可以轻松录制 并将屏幕、音频和麦克风内容 保存到你的 App 中 让我们来了解一下这是如何实现的 和之前一样 你将配置 SCStream 来捕获内容 你还将使用这个相同的 流来进行录制 要录制 你只需要 添加这个新的输出 你可以使用 SCRecordingOutputConfiguration 来配置 SCRecordingOutput 这个配置让你可以指定 保存文件的位置、 文件类型和视频编解码器
此外还有新的 SCRecordingOutputDelegate 协议 你可以使用它来响应 流中的录制事件 现在我们来看看使用新 API 进行录制的一些代码 你需要先创建一个 SCRecordingOutputConfiguration 实例 设置 outputURL 以指定 保存文件的位置
你可以选择为存储的文件 自定文件类型和视频编解码器 接下来创建一个 SCRecordingOutput 实例 使用录制配置并设置 用于接收事件的委托
然后将配置好的 recordingOutput 添加到流 调用 startCapture 以启动流 这也将启动录制 在未来的某个时间 你将调用 stopCapture 来停止流和录制 在某些情况下 你可能希望 在停止录制后继续流式传输 要继续流式传输内容 改为调用 removeRecordingOutput 就可以仅停止录制
在录制过程中 App 通过 SCRecordingOutputDelegte 收到事件通知 你将在以下情况收到通知: 录制开始时 出现错误时 以及录制成功完成时 这个时候 录制文件已准备就绪 可在你的 App 中使用
这样就可以了 这个新的录制 API 提供了 一种简单便捷的方式 在你的 App 中录制 屏幕、音频和麦克风内容
现在你可以使用 ScreenCaptureKit 在 App 中捕获 HDR 内容 可以使用新的麦克风输出 从流接收麦克风样本 最后 借助新的录制 API 你可以轻松地录制屏幕、 音频和麦克风内容 想要进一步了解 ScreenCaptureKit 提供的精彩功能 请务必观看 我们之前发布的这些视频 非常感谢大家的观看
-
-
5:22 - Capture HDR
// Get content that is currently available for capture. let availableContent = try await SCShareableContent.current // Create instance of SCContentFilter to record entire display. guard let display = availableContent.displays.first else { return } let filter = SCContentFilter(display: display, excludingWindows: []) // Create a configuration using preset for HDR stream canonical display. let config = SCStreamConfiguration(preset: .captureHDRStreamCanonicalDisplay) // Create a stream with the filter and stream configuration. let stream = SCStream(filter: filter, configuration: config, delegate: self) // Add a stream output to capture screen content. try stream.addStreamOutput(self, type: .screen, sampleHandlerQueue: nil) // Start the capture session. try await stream.startCapture()
-
6:40 - Use a local display preset to capture HDR
// Create an SCStreamConfiguration with preset for HDR. let config = SCStreamConfiguration(preset: .captureHDRScreenshotLocalDisplay) // Call the screenshot API to get CMSampleBuffer representation let screenshotBuffer = try await SCScreenshotManager.captureSampleBuffer(contentFilter: filter, configuration:config) // Call the screenshot API to get CGImage representation. let screenshotImage = try await SCScreenshotManager.captureImage(contentFilter: filter, configuration:config)
-
8:05 - Capture samples of microphone audio
// Create instance of SCStreamConfiguration. let config = SCStreamConfiguration() // Enable microphone capture and set id of microphone to capture. config.captureMicrophone = true config.microphoneCaptureDeviceID = AVCaptureDevice.default(for: .audio)?.uniqueID // Create an SCStream instance. let stream = SCStream(filter: filter, configuration: config, delegate: self) // Add stream outputs for capturing screen and microphone. try stream.addStreamOutput(self, type: .screen, sampleHandlerQueue: nil) try stream.addStreamOutput(self, type: .microphone, sampleHandlerQueue: nil) // Start the capture session try await stream.startCapture() // Implement SCStreamOutput function to receive samples. func stream(_ stream: SCStream, didOutputSampleBuffer sampleBuffer: CMSampleBuffer, of type: SCStreamOutputType) { switch type { case .screen: handleLatestScreenSample(sampleBuffer) case .audio: handleLatestAudioSample(sampleBuffer) case .microphone: handleLatestMicrophoneSample(sampleBuffer) } }
-
9:38 - Record to file
// Create a recording output configuration. let recordingConfiguration = SCRecordingOutputConfiguration() // Configure the outputURL (optionally set file type and video codec). recordingConfiguration.outputURL = url recordingConfiguration.outputFileType = .mov recordingConfiguration.videoCodecType = .hevc // Create the recording output with the configuration. let recordingOutput = SCRecordingOutput(configuration: recordingConfiguration, delegate: self) // Add an SCRecordingOutput to the stream. try stream.addRecordingOutput(recordingOutput) // Start capturing (which will also start recording). try await stream.startCapture() // Stop recording. try await stream.stopCapture() //OR // Stop recording, but keep stream running. try stream.removeRecordingOutput(recordingOutput)
-
10:27 - Respond to delegate events
func recordingOutputDidStartRecording(_ recordingOutput: SCRecordingOutput) { // Recording started asynchronously after addRecordOutput. } func recordingOutput(_ recordingOutput: SCRecordingOutput, didFailWithError error: Error) { // Recording failed with error. } func recordingOutputDidFinishRecording(_ recordingOutput: SCRecordingOutput) { // Recording finished after calling either removeRecordOutput or stopCapture. }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。