WWDC Quick Look 💓 By SwiftGGTeam
Capture and stream apps on the Mac with ReplayKit

Capture and stream apps on the Mac with ReplayKit

观看原视频

Highlight

ReplayKit 在 WWDC 2020 登陆 macOS,让 Mac 应用可以在应用内录制、获取音视频样本、发起第三方直播,并通过游戏手柄按钮触发录制。


核心内容

Mac 游戏和图形应用以前要提供录屏体验,常常只能把用户交给系统录屏或外部推流工具。应用自己很难控制录制入口,也拿不到统一的预览、保存、分享流程。直播更分散,用户要离开应用去选择第三方服务,开发者还要自己协调画面、应用音频、麦克风和隐私提示。

ReplayKit 原来已经在 iOS 和 tvOS 上提供录制、捕获和直播能力。Johnny Trenh 在开场说明,WWDC 2020 的变化是把这些能力带到 Mac。Mac 应用现在可以录制应用画面、应用音频和麦克风,也可以把音视频样本送回应用进程,或者把应用内容发送到第三方直播服务。

这场 session 按三个入口讲完整流程。录制入口调用 RPScreenRecorder 开始和停止录制,结束后用 RPPreviewViewController 交给用户编辑、保存或分享。捕获入口调用 startCapture,持续收到视频、应用音频和麦克风样本。直播入口用 RPBroadcastActivityController 显示第三方服务选择器,再用返回的 RPBroadcastController 控制直播。

macOS 版本还增加了两个需要应用配合的外部入口。ReplayKit 会在菜单栏显示活跃会话图标,用户可以从那里停止录制、捕获或直播。Game Controller 框架也接入 ReplayKit,PS4 手柄双击 Share、Xbox 手柄双击 Select 可以开始或停止应用内录制。


详细内容

应用内录制:从共享录制器到预览控制器

01:41)ReplayKit 的应用内录制会捕获应用画面、应用音频和麦克风,并写入影片文件。应用先取得 RPScreenRecorder 的共享录制器,再调用 startRecording。录制启动后,示例应用只更新内部 recordingState 和按钮标题,让同一个按钮下一次点击进入停止流程。

关键点:

  • RPScreenRecorder 是录制、捕获流程的统一入口。
  • startRecording 负责启动应用内录制,ReplayKit 开始收集画面、应用音频和麦克风。
  • 启动回调会返回错误信息,应用应该只在没有错误时更新录制状态。
  • 演示项目用一个按钮承担开始和停止两种状态,所以状态同步是基础工作。

04:35)停止录制时,应用调用 stopRecording。ReplayKit 保存录制内容,然后通过 RPPreviewViewController 把预览界面交给应用。Mac 上可以用窗口 sheet 展示这个预览界面,用户可以编辑、裁剪、保存或分享影片。

关键点:

  • stopRecording 结束录制,并在完成回调中返回预览控制器。
  • 应用要保存 RPPreviewViewController 的引用,避免用户完成操作后无法关闭它。
  • 应用要成为预览控制器代理,因为用户点保存或关闭以后,代理方法会通知应用收起界面。
  • macOS 的保存体验会走标准文件保存流程,用户仍然掌握最终保存位置。

新的 URL 停止方式:让应用读到录制文件

07:07)传统应用内录制不会把影片文件直接交给应用。ReplayKit 创建影片,用户通过预览界面决定保存或分享。演讲提到很多开发者希望应用能读取录制结果,所以这一年增加了带目标 URL 的停止录制方式。

关键点:

  • 新的 stopRecordingWithURL 允许应用提供一个目标 URL。
  • ReplayKit 会把录制影片写入这个位置,并给应用读取权限。
  • 这个能力适合做应用内回放库、素材管理器或自定义视频编辑器。
  • 这里的重点是文件所有权变化:用户仍然知道录制正在发生,应用也能把结果纳入自己的工作流。

应用内捕获:把样本交回应用进程

08:44)如果应用不想让 ReplayKit 生成影片,可以改用应用内捕获。调用 startCapture 后,ReplayKit 会把音频、视频和麦克风样本发送回应用进程,开发者自己决定怎么处理这些样本。

关键点:

  • startCapture 和录制一样从共享录制器发起。
  • 它包含两个处理入口:样本处理器会反复收到数据,完成处理器只在捕获启动时执行一次。
  • 每次样本回调都会带回样本、样本类型和错误信息。
  • 样本类型用于区分视频、应用音频和麦克风音频。

12:00)演示项目收到样本后,只按类型打印日志。真实应用可以把视频样本用于截图、游戏叠加层或自定义 HUD,也可以把音频样本送入自己的处理管线。这里的价值不在生成影片,而在应用能直接接触原始内容。

关键点:

  • 视频样本可以驱动截图、画面叠加和回放前处理。
  • 应用音频和麦克风音频分开返回,便于单独处理游戏声音和用户声音。
  • 捕获启动后,应用通常要禁用录制和直播按钮,避免 ReplayKit 会话互相冲突。
  • 演讲中的摄像头画中画也是状态更新的一部分,捕获开始后才展示。

直播:用广播选择器连接第三方服务

14:21)ReplayKit 的直播流程分三步。应用先显示第三方服务选择器。用户选好服务后,ReplayKit 建立和广播扩展的连接。应用拿到 RPBroadcastController,再用它开始、暂停、停止直播。

关键点:

  • RPBroadcastActivityController 负责在 macOS 上展示广播服务选择器。
  • 用户选择服务后,ReplayKit 会把应用连接到对应的广播扩展。
  • 返回的 RPBroadcastController 是直播控制入口,后续开始和结束都依赖它。
  • 应用需要保存这个控制器引用,因为停止直播时还要使用同一个对象。

19:51)macOS 的直播入口和 iOS 不同。iOS 使用 RPBroadcastActivityViewController,macOS 改成 RPBroadcastActivityController。由于 Mac 支持多屏幕和多窗口,应用调用 showBroadcastPicker 时要给出 CGPoint 和窗口引用;如果想直接引导用户到某个服务,还可以传入 preferred extension identifier。

关键点:

  • CGPoint 表示广播选择器在窗口里的左下角起点。
  • 窗口引用让 ReplayKit 知道选择器应该出现在 Mac 的哪个窗口上。
  • preferred extension identifier 可以指定某个广播服务。
  • 传入空的服务标识时,用户会看到可用的第三方服务列表。

菜单栏隐私入口:外部停止也要同步状态

20:48)macOS 上只要存在活跃的录制、捕获或直播会话,菜单栏就会出现 ReplayKit 图标。这个图标提示用户正在进行 ReplayKit 会话,也允许用户从应用外停止会话。

关键点:

  • 应用不能假设所有停止动作都来自自己的按钮。
  • 用户从菜单栏停止会话时,ReplayKit 会调用 didStopRecordingWithPreviewViewController
  • 对于应用内捕获和直播,传入的 RPPreviewViewController 会是空值。
  • 应用应该在这个回调里统一清理录制、捕获、直播状态,并恢复相关按钮。

游戏手柄入口:录制可以从手柄开始

21:42)Game Controller 框架在 iOS、tvOS 和 macOS 上内建了 ReplayKit 功能。PS4 手柄双击 Share 按钮,或 Xbox 手柄双击 Select 按钮,可以开始应用内录制。再次双击会停止录制,并在 iOS 保存到照片,在 macOS 保存到桌面。

关键点:

  • 手柄入口适合游戏里的高光片段录制,玩家不用离开手柄。
  • 对已经使用 ReplayKit 的应用,手柄可能在应用按钮之外启动或停止录制。
  • 演讲建议对 RPScreenRecorder 的 availability 和 recording 属性做 key-value observing。
  • 应用还要实现 RPScreenRecorderDelegate 的停止回调,确保 UI 状态和实际录制状态一致。

核心启发

  • 做什么:做一个 Mac 游戏高光回放库。为什么值得做stopRecordingWithURL 让应用能读取 ReplayKit 生成的影片。怎么开始:用 RPScreenRecorder 发起录制,停止时把结果写入应用管理的目录,再为每段影片记录关卡、时间和玩家备注。

  • 做什么:做带实时 HUD 的教学录制。为什么值得做startCapture 会把视频、应用音频和麦克风样本送回应用进程。怎么开始:先按样本类型拆分视频和音频,再把视频样本送入叠加层流程,加入鼠标位置、快捷键和步骤编号。

  • 做什么:在创作工具里加入直播开播按钮。为什么值得做RPBroadcastActivityController 可以让用户直接选择第三方直播服务。怎么开始:从主窗口按钮显示广播选择器,用户选好服务后保存 RPBroadcastController,再用它控制开始和结束。

  • 做什么:做手柄驱动的录制状态 HUD。为什么值得做:Game Controller 框架可以在应用按钮之外触发 ReplayKit 录制。怎么开始:观察 RPScreenRecorder 的 availability 和 recording 属性,在 HUD 里同步显示录制红点、时长和保存结果。

  • 做什么:做统一的 ReplayKit 会话恢复逻辑。为什么值得做:macOS 菜单栏图标允许用户从应用外停止录制、捕获或直播。怎么开始:把按钮状态、摄像头画中画、直播控制器和预览控制器清理放进同一个停止回调路径。


关联 Session

评论

GitHub Issues · utterances