大多数浏览器和
Developer App 均支持流媒体播放。
-
使用 ReplayKit 探索滚动剪辑
用户再也不会在您的游戏或 app 中错过任何精彩时刻。敬请了解 ReplayKit 的最新更新:剪辑屏幕录制。它可为您的 app 提供滚动缓冲区来存储以前的视频和音频样本。探索如何为用户录制和保存令人难忘的时刻,并了解如何在最相关的时候呈现这些剪辑。最后,我们会引导您将 ReplayKit 集成到您的 iOS 和 macOS app 中。
资源
相关视频
WWDC21
WWDC20
-
下载
哈啰 欢迎来到 “使用ReplayKit录制滚动视频片段” 我是欧内斯特 我是ReplayKit团队的软件工程师 今天 很高兴在这里跟大家介绍 一种捕捉你应用程序上精彩画面的 新方法 让我先带各位认识ReplayKit的概貌
ReplayKit是一个能让你录制 你的应用程序屏幕画面和声音的框架 当大家想要制作教学视频 或只是想要炫耀他们的游戏玩法 应用程序内的屏幕录制能制作出 他们想储存和跟朋友分享的视频 那如果你想对创作的视频内容 有更多的掌控呢? 你可能会想加上额外的滤镜 或覆盖层 你可以在应用程序内的屏幕撷取 做到这些 应用程序内的屏幕撷取 会将音频和视频样本 直接加入你的应用程序中 让你可以完全掌握 已经制作出来的内容 我们都知道比起玩游戏 第二棒的事就是看玩家的游戏直播 应用程序内的直播让各位把应用程序 串流到第三方直播平台更容易 让全世界都能观看 我们现今的录屏功能已经涵盖了很广的案例 不过有一项是目前没有的 想象你的玩家刚打败所有敌人 在游戏中解锁通往下一关的钥匙 现在他们想把那个时刻 分享给他们的朋友 可是因为这是他们第一次玩这关 他们不知道会发生让人这么兴奋的事 所以他们无法捕捉那个时刻 目前 玩家们如果想要存下 所有值得纪念的精彩画面 他们必须把整段游戏过程录下来 这样会产生很大的录像文件 不只会占掉很多储存空间 也需要时间来裁剪成较短的视频 如果能在所有精彩画面发生的当下 立刻录下来 那不是很棒吗? 或者更好的是 如果ReplayKit 可以帮你做到这些 给你每一段精彩画面的视频? 今年 我很开心要向大家介绍 这个我们一直努力开发的新性能 片段录制 片段录制会维持一个 音频和视频样本的 滚动缓冲区 当你命令输出视频片段时 它能将长达15秒前的样本 输出成短视频片段 因此你不需要知道什么时候开始录制 你只需要知道你想要什么时候输出
有几种方式可以输出视频片段 你可以在你的应用程序中 加入用户界面按钮 或游戏控制器支持 这样大家就可以手动控制 什么时候要录制视频 只要单击按钮 他们就能在想要的时候录下视频 你也可以在你的应用程序中 加入能够自动撷取视频的触发程序 有了这个 你就能随时录下 那些刺激的时刻 譬如当他们做出完美的连击 打败最终的大魔王 或打出他们最佳的快速通关的时刻 有了这些视频片段 你就能建立个性化的用户体验 你可以添加一个定制的覆盖层 以打开一组视频集合 或者你可以呈现 在那一关结束时 所有录制下的精彩画面 给你的玩家看和分享
片段录制在iOS和macOS上皆可使用 这个强大功能与现有的 录制、截屏和直播API并列 就像我们的其他功能一样 片段录制会提供相同的高清画质 低性能影响 和内建隐私保障措施 片段录制的背后原理是怎么运作的? 让我们来看看吧 片段录制包含三个API 开始、停止和输出 要启动片段缓冲 你的应用程序需要调用 RPScreenRecorder接口 获取到sharedRecorder单例 有了单例之后 你可以调用 startClipBuffering API 这时候 ReplayKit将你应用程序的 屏幕和音频样本储存到滚动缓冲区 每次ReplayKit收到新的样本后 会移除任何在15秒前的样本 滚动缓冲区启动后 ReplayKit 会等待你的应用程序命令它输出 当应用程序调用export clip API ReplayKit就会去处理剩下的部分 把当下的视频片段回传给你 当你不再需要滚动缓冲区 或者当你想使用 ReplayKit的其他功能 例如应用程序内的直播 你可以调用 stop API ReplayKit便会停止这个会话
知道这些信息后 让我给大家展示一个 使用了新的片段录制 API 的 示例项目 你可能已经从我们去年的课程中 熟悉了这个示例项目 更新的示例项目 现在包含片段录制相关代码 让我们来看看这个代码 如同其他的视频录制一样 这是和主画面中的“启动录制”按钮 相连结的IBAction 这个按钮的作用是 如果还没启动录制 则开始视频缓冲 如果已经启动录制 则停止视频缓冲 现在让我们看看 当你开始视频缓冲时会发生什么事 这是要开始视频缓冲的编码 你会从RPScreenRecorder 取得共享录制实例 调用startClipBuffering 设置结束回调 这里 在回调中 你需要处理任何 在尝试启动时发生的错误 包含更新用户界面 如果没有错误发生 那你还是应该更新用户界面 以显示目前正在进行录制
跟启动一样 在范例项目中 有一个停止视频缓冲规则 这是你会得到共享实例的地方 不过这次 你要调用 stopClipBuffering API 在完成回调中 你需要处理任何 在尝试停止时发生的错误 并且更新用户界面 以显示你没有在录制了
我已经说明了启动 和停止视频缓冲的编码 让我们来看看输出视频时 所需的编码 这是和“输出视频”按钮 相连结的IBAction编码 当有人决定要产出一段视频时 这个动作就会被触发 提醒一下 不是只能用这个方法 你也能以你自己的程序内触发方式 来自动输出视频 这里 如果你正在录像 并且从先前startClipBuffering方法中 将按钮激活 exportClip函数将会被调用 要调用exportClip API 你需要指定一个URL和视频长度
类似启动和停止的接口 你需要在completionHandler中处理错误 如果没有错误发生 你就会在指定的URL下得到视频片段 有了这些视频片段 你就可以建立和组织 你自己的用户体验 在我这里的范例编码中 视频会直接存入Photos
就是这样! 有了这三个API 现在你就可以将短视频录制 加到你的应用程序中 你可以在指定的URL里 直接访问视频片段 因此你可以建立你自己的 应用程序内体验 就像前面提到过 另一种得到视频片段的方式 是通过加入游戏控制器支持 game controller框架 现在也有内建短视频录制能力 请记得 从game controller输出的短视频 会直接存在Photos或桌面上 要以产生的短视频 制作你自己的应用程序内体验 你需要使用ReplayKit clips API 当你整合ReplayKit 和game controller框架时 比较好的方法是确保 你对RPScreenRecorder的 available 和 recording 属性 使用了健值观察 也请务必遵循 RPScreenRecorderDelegate协议 这样你才能在需要时 更新你应用程序的状态 把短视频录制整合到你的应用程序 就是那么简单 有了短视频录制 你的应用程序 就可以在当下捕捉所有的精彩时刻 我很期待看到大家制作的所有的短视频 和新的使用者体验 非常谢谢大家收看我们的说明 希望各位有个很棒的WWDC [打击乐音乐]
-
-
5:19 - Start clip buffering
// Start clip buffering API call func startClipBuffering() { RPScreenRecorder.shared().startClipBuffering { error in if error != nil { print("Error attempting to start Clip Buffering") // Update the app recording state and UI. self.setClipState(active: false) } else { // No error encountered attempting to start a clip session. // Update the app recording state and UI. self.setClipState(active: true) // Set up camera View. self.setupCameraView() } } }
-
5:46 - Stop clip buffering
// Stop clip buffering func stopClipBuffering() { RPScreenRecorder.shared().stopClipBuffering { error in if error != nil { print("Error attempting to stop clip buffering") } // Update the app recording state and UI. self.setClipState(active: false) // Tear down camera view. self.tearDownCameraView() } }
-
6:13 - Export clip button
// Export clip button @IBAction func exportClipButtonTapped(_ sender: Any) { // If clip buffering is active, export clip if self.isActive && self.getClipButton.isEnabled { exportClip() } }
-
6:41 - Export clip
// Export clip func exportClip() { let clipURL = getAppTempDirectory() let interval = TimeInterval(5) print("Generating clip at URL: \(clipURL)") RPScreenRecorder.shared().exportClip(to: clipURL, duration: interval) { error in if error != nil { print("Error attempting to export clip") } else { // No error, so save clip at URL to photos self.saveToPhotos(tempURL: clipURL) } } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。