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
- What’s new in Low-Latency HLS — ReplayKit 负责采集和发起直播,低延迟 HLS 适合继续理解直播播放链路。
- Advancements in Game Controllers — 本场提到手柄双击触发录制,这场补足 2020 年手柄框架的新能力。
- Design for Game Center — 适合把录制高光、玩家资料和游戏社交体验一起设计。
- Bring your Metal app to Apple silicon Macs — 如果 ReplayKit 用在 Mac 游戏或图形应用中,这场帮助理解 Apple silicon 上的图形性能背景。
评论
GitHub Issues · utterances