
-
打造丝滑的多画面播放体验
了解如何在你的 App 中打造高级的多画面播放体验。我们将介绍如何跨多个播放器实现播放同步、通过隔空播放的无缝整合提升多画面播放效果,同时优化播放质量,以便提供引人入胜的多画面播放体验。
章节
- 0:00 - 简介
- 2:08 - 多画面播放协调
- 9:09 - 在提供多画面体验的 App 中支持隔空播放
- 14:14 - 优化多画面视频流的播放质量
资源
相关视频
WWDC21
-
搜索此视频…
大家好 我叫 Julia 是 AVFoundation 工程师 在这个视频中 我将探讨如何在 App 中 打造引人入胜的 多播放器用户体验 人们喜欢从体育比赛等 直播活动中获取多视角内容 或者同时观看多个频道 多画面播放体验 需要同时播放 多个音视频流 其中一个用例是播放 同一活动的多个不同媒体流 例如 一场足球比赛可以 包含解说员音频流 以及两个不同角度的 球场视频流 在这种情况下 确保不同媒体流 之间的播放同步至关重要 这样关键画面才能对齐 其他需要同步不同媒体流的例子 可能包括多个拍摄角度下的 音乐演唱会 或者同时具有 主内容流 和手语翻译流的 主题演讲
另一个多画面用例是 播放多个完全不同活动的 不同媒体流 例如 在奥运会期间同时显示 田径和游泳比赛流媒体 并配以一些背景音乐 在这类情况下 音频流和视频流 不需要彼此同步 AVFoundation 和 AVRouting 提供了 API 来帮助开发者更轻松地 构建丰富的多画面播放体验 在这个视频中 我将介绍这些 API 首先 我将介绍如何 在多个媒体流之间同步播放 然后讨论如何处理 隔空播放的多视图路由 最后 我将介绍如何 优化多播放器的播放质量
在显示需要协调的 多个媒体流时 (例如体育比赛) 确保所有播放器 同步播放至关重要 这样关键画面才能对齐 这意味着 所有播放行为 (比如播放、暂停和搜寻) 都需要协调 但这可能是 一个复杂的过程 除了速率变化和搜寻外 还需要管理复杂的行为 AVFoundation 框架中的 AVPlaybackCoordinationMedium 可简化在多个播放器之间 紧密同步播放的过程 它负责处理速率变化 和时间跳转的协调 以及卡顿、中断 和启动同步等 其他复杂行为 我将演示如何使用 AV Playback Coordination Medium 在 App 中协调 多个播放器之间的播放 在这个视频的演示中 我将使用火车沿轨道行驶的 多个不同拍摄角度为例 其中火车会穿过植物和 其他物体及地标等不同场景 这个火车示例有助于 说明多画面内容 在多个拍摄角度下的呈现效果 在协调演示中 我将添加火车轨道 周围的多个拍摄角度 就像观看体育比赛时 切换不同拍摄角度一样 这是一个 iPad App 包含玩具火车在轨道上行驶的 多个不同视频流 我从火车轨道的 鸟瞰图开始播放 我想看到火车的更多角度 所以添加了轨道的侧视图 第二个媒体流与当前 播放的媒体流同步 我还将添加另外两个 从轨道周围录制的拍摄角度 每个新增的媒体流都会同步加入 暂停时 所有播放器 都会同步暂停 仔细观察 可以在四个播放器中 从多个角度看到火车位置 在左上角的鸟瞰图中 我看到火车位于桌子 上边缘靠近植物的位置 从其他拍摄角度可以看到 火车开始进入 直线轨道部分 正从后方接近猴子玩偶 根据每个视频上的时间戳 可以确认所有视频完全同步
现在 我要开始播放 所有播放器将开始同步播放 我可以从各个角度 完美协调地观看火车行进
接下来 我将 向前搜寻 10 秒 每个操作完成后 播放器都会保持同步
即使我离开我的 iPad App 并切换到画中画视图 媒体流也会保持同步
如果我返回这个 App 所有视频仍在同步播放
这在各种系统界面中也能很好地工作 例如在“播放中”界面中 播放行为同样保持协调 我可以暂停和播放 播放器会保持同步 所有播放器的协调工作 创造了出色的用户体验 在演示中 我展示了 火车穿过地标的示例 在现实场景中 这可以是体育赛事、 手语媒体流 或其他需要协调 播放的多画面用例 现在我已经介绍了 它的实际效果 接下来我将展示如何 在 App 中构建这种体验 AV Playback Coordination Medium API 构建在现有用于同播共享的 AVPlaybackCoordination 架构之上 每个 AVPlayer 都有 一个 AVPlaybackCoordinator 用于协调播放器的 播放状态与所有其他 连接播放器的关系 如需更详细了解 播放协调器及它的工作方式 请观看视频 “使用群组活动协调媒体体验” 如果有多个视频播放器 播放协调器需要 处理远程状态管理 并确保每个播放器 与其他播放器保持同步 AV Playback Coordination Medium 可在所有播放协调器之间 传递状态变化 协调介质将状态 从一个协调器 传递到其他播放协调器 并使它们全部保持同步 这是通过消息传递实现的 协调介质在播放器 之间传递重要状态变化信息 例如播放速率、时间、 和其他状态变化 例如 如果一个播放器暂停 它会将这个信息 发送到协调介质 然后协调介质 会将这个信息 发送到所有其他 连接的播放协调器 播放协调器将处理 和应用播放状态 这样 在播放协调的 多画面内容时 所有播放器 都能保持同步 实现这一点 只需几行代码 首先设置我的 AVPlayer 每个都使用不同的资源 这里 我使用了两个视频 一个用于特写镜头 一个用于鸟瞰镜头 我分别使用不同的 资源配置它们 接下来 创建协调介质 然后 通过使用 coordinate 方法 将每个播放器连接到协调介质 这个方法可能会抛出错误 因此处理它们很重要 最后 我将对第二个播放器 (鸟瞰镜头) 执行相同的操作 现在 两个播放协调器都 已连接到协调介质 每个播放器上的 操作将同步进行 我只需在一个 播放器上调用操作 所有其他连接的播放器 都会执行相同的操作 在本例中 我只使用了 2 个播放器 但你可以连接更多播放器 AVPlaybackCoordinationMedium 非常适合协调多画面播放
接下来 我将讨论可应用于 任意类型多画面播放的工具 包括协调和非协调播放 隔空播放可带来出色的 外部播放体验 用户可以将视频流 路由到家中更大的屏幕上 或将音频流路由到 HomePod 将正确的视图路由到 正确的设备非常重要 我将介绍如何在 App 中 通过多画面体验支持隔空播放 让我们来看看实际效果! 在我将展示的示例中 我正在观看鸟瞰图视频 和轨道特写视频 两个视频都在我的 iPad 上播放 两个视频都在 我的 iPad 上播放但是 我想 通过隔空播放将 iPad 上的 视频传输到 Apple TV 隔空播放接收器 只能支持单个媒体流 因此如果我路由到它 我希望鸟瞰图视频 在大屏幕上播放 以便更清楚地看到所有细节 我在 iPad 上开始播放 两个视频并路由到 Apple TV 这样做时 特写画面 将继续在 iPad 上播放而… 鸟瞰视频将在 大屏幕上播放 因为它是我首选的播放器 如果我想更改 在电视上播放的视频 我可以通过 将首选播放器更新为 特写流来在媒体流之间切换 而两个视频将交换位置 在这个 iPad App 上 这是通过 按星标按钮完成的 这个按钮会将特写视频 设置为首选播放器 现在 我选择它 特写流将在电视上播放 而鸟瞰画面将 在 iPad 上播放 此外 我可以暂停和播放 如果媒体流是协调的 它们将保持同步 这是一个协调 播放用例的示例 但是 非协调多画面流 也能与隔空播放无缝协作 AVRoutingPlaybackArbiter 是 AVRouting 框架的一部分 它使你能够轻松地集成 对多画面体验的隔空播放支持 播放仲裁器 确保多画面与仅支持 单个视频流或 音频流的隔空播放 或其他外部播放 体验顺畅协作 它管理切换到正确视频流 或音频流的复杂性 AVRoutingPlaybackArbiter 负责管理和应用 非可混合音频路由的 偏好设置 这些是接收器上只能 播放单个音频流且 无法同时播放音频的音频路由 播放仲裁器还处理 受约束的外部播放视频路由 这些是接收器上只能 播放单个视频流的路由 比如隔空播放视频和 闪电数字影音转换器 在多画面播放情况下 比如在火车多画面视频中 我可能有一个鸟瞰图视频 和多个特写镜头 我希望每当隔空播放视频时 鸟瞰图视频优先 首先 我获取 播放仲裁器单一实例 接下来 将鸟瞰图设置为 播放仲裁器的属性 preferredParticipantForExternalPlayback 现在 如果我在播放多画面内容时 从 iPad 路由到 Apple TV 鸟瞰图会将视频 路由到 Apple TV 而其他视频继续 在 iPad 本地播放 同样 如果有多个播放器且 鸟瞰图应优先处理音频 则首先获取 播放仲裁器单一实例 并将鸟瞰图播放器设置为 preferredParticipant ForNonMixableAudioRoutes 如果正在播放多画面内容 并且将音频从 iPad 路由到 HomePod 则将播放鸟瞰图的音频 接下来 我将展示如何 使用这个 API 的示例 首先 我设置两个 AVPlayer 一个用于特写镜头 一个用于鸟瞰图 然后 从 AVRoutingPlaybackArbiter 的实例 获取播放仲裁器单一实例 我希望每次路由到隔空播放时 在大屏幕上看到鸟瞰视频 因此我将它设置为 外部播放的首选参与者 而如果路由到 HomePod 我希望听到它的音频 因此我还将它设置为 不可混合音频路由的 首选参与者 在这个示例中 我为这两个属性 选择了同一个播放器 但也可以设置为 不同的播放器 通过 AVRoutingPlaybackArbiter 确保隔空播放和 其他外部音频和 视频播放体验在你的 多画面 App 中无缝集成 接下来 我将介绍如何 管理这些媒体流的质量 观看多画面内容时 某些媒体流可能 比其他媒体流更重要 例如 在多画面模式下 观看体育比赛时 一个媒体流可能是 场地的鸟瞰图 另外两个媒体流可能是 场地的不同视角 另一个媒体流可能是 人群的特写镜头
在这个示例中 我更关注场地的鸟瞰图 我希望更清楚地看到它 并让它以更高的质量播放 我不太关心人群的特写镜头 因此我不需要看到细节 也不介意它 以较低的质量播放 在多画面场景下 不同的播放器 可能有不同的质量需求 这可通过设置 AVPlayer 的 networkResourcePriority 来指示 我将详细讨论这是如何工作的 线上播放内容时 每个 播放器都会消耗网络带宽 如果这些播放器大小相同 你可能希望每个播放器 消耗相等的网络带宽 并以相同的质量播放 但是 每个播放器可能有 不同的网络带宽和质量需求 为此 请设置 AVPlayer 的 networkResourcePriority 每个播放器都 以默认优先级开始 你可以将优先级 设置为高或低 高优先级 意味着播放器需要 高水平的网络资源 并且以高质量分辨率进行 流媒体播放至关重要 低优先级 意味着播放器需要 最小的网络带宽 并且以高质量分辨率进行 流媒体播放不是那么重要
我将通过一个例子 来说明如何 使用 networkResourcePriority 来实现这一点 首先 创建一个 AVPlayer 然后设置播放器的 networkResourcePriority 在体育赛事示例中 场地鸟瞰图最为重要 因此我将这个优先级设为高 人群特写视图不太重要 因此我将它的优先级设为低 因此现场鸟瞰图 将获得更高的网络优先级 而人群特写视图 将获得较低的网络优先级 当系统分配网络带宽资源时 这些网络优先级 可帮助指示 播放器的优先级 确切的网络带宽分配 会考虑各种其他因素 例如其他播放器的 数量、视频层大小、 硬件限制等 接下来 我将展示 网络优先级的实际应用 在这个示例中 我将 展示火车多画面示例 这可以扩展到 体育比赛示例 以及其他需要不同 播放质量的多画面场景 我正在观看两个不同的媒体流 火车轨道的鸟瞰图 以及火车的特写视图 对我来说 观看火车行进时 不能错过任何时刻 因此我非常希望 清楚地看到鸟瞰图 我将鸟瞰图的网络资源 优先级设为高 这两个视频目前 都以高分辨率播放 分辨率标签位于 视频的底部 如果遇到网络状况不佳 且网络带宽有限的情况 右侧的特写视图将首先 切换到较低的分辨率 我现在可以看到 这种情况正在发生 左侧更重要的鸟瞰图 将保持高清分辨率 通过设置播放器的 网络资源优先级 你可以更好地 控制媒体流的播放质量 我讨论过的 AVFoundation 和 AVRouting API 协同工作 使你能够 打造无缝的多画面体验 现在你已经了解了 这些涉及播放协调、 隔空播放集成和 质量优化的 高级多画面功能 接下来使用多画面构建 和增强你自己的 App 吧 使用 AVPlaybackCoordinationMedium 打造引人入胜的 同步多画面体验 同步你喜爱的 体育赛事的多个拍摄角度 探索 AVRoutingPlaybackArbiter 通过隔空播放集成 增强多画面 App 将多流播放 (例如 ASL 流) 带到大屏幕上 通过网络带宽分配 微调和优化播放质量 确保重要媒体流 以高质量播放 我们期待大家打造出 令人兴奋的多画面播放体验 感谢大家观看!
-
-
7:55 - Coordinate playback
import AVFoundation var closeUpVideo = AVPlayer() var birdsEyeVideo = AVPlayer() let coordinationMedium = AVPlaybackCoordinationMedium() do { try closeUpVideo.playbackCoordinator.coordinate(using: coordinationMedium) }catch let error { // Handle error } do { try birdsEyeVideo.playbackCoordinator.coordinate(using: coordinationMedium) }catch let error { // Handle error }
-
13:17 - Set preferred participant
import AVFoundation import AVRouting var closeUpVideo = AVPlayer() var birdsEyeVideo = AVPlayer() let routingPlaybackArbiter = AVRoutingPlaybackArbiter.shared() routingPlaybackArbiter.preferredParticipantForExternalPlayback = birdsEyeVideo routingPlaybackArbiter.preferredParticipantForNonMixableAudioRoutes = birdsEyeVideo
-
16:15 - Set network resource priority
birdsEyeVideo.networkResourcePriority = .high closeUpVideo.networkResourcePriority = .low
-
-
- 0:00 - 简介
了解如何使用同步和非同步媒体流创建多画面播放体验,例如从多种角度拍摄的足球比赛,以及非同步流式播放的不同事件。你可以使用 AVFoundation API 和 AVRouting API 进行同步、隔空播放路由,以及为多个播放器优化播放质量。
- 2:08 - 多画面播放协调
AVFoundation 框架的 AVPlaybackCoordinationMedium 简化了 App 中多个视频播放器之间的同步播放。 这个框架可处理复杂的行为,例如速度变化、时间跳转、卡顿、中断和启动同步。通过将各个 AVPlayer 连接到协调介质,播放、暂停和跳转到指定时间点等操作会自动同步应用于所有播放器。
- 9:09 - 在提供多画面体验的 App 中支持隔空播放
通过隔空播放,用户可以将视频从设备流式传输到更大的屏幕,或将音频流式传输到 HomePod。对于同时播放多个媒体流的多画面体验,可以使用 AVRoutingPlaybackArbiter 来管理将哪些流传输到外部设备。 默认情况下,仲裁器会优先传输用户的首选媒体流进行外部播放。例如,在多画面视频 App 中,可以将鸟瞰视频设置为首选流,这样当启用隔空播放时,这个视频就会自动在 Apple TV 上播放,而特写镜头视频会继续在 iPad 上播放。用户可以通过更新首选播放器来轻松切换媒体流。 仲裁器还能处理音频路由,确保将音频传输到外部播放时,让首选音频流在 HomePod 上播放。这种无障碍整合使人们能够轻松控制多画面播放体验,并能够暂停、播放和切换媒体流,同时不打破同步。
- 14:14 - 优化多画面视频流的播放质量
在多画面内容的流式传输中,不同的媒体流可能重要性也不同。例如,赛事现场的鸟瞰画面可能比人群的特写镜头更重要。 要根据这种先后主次来优化播放质量,请使用 AVPlayer 的 networkResourcePriority 设置。这让你可以为关键媒体流分配高优先级,确保它们获得更多的网络带宽并保持更高的分辨率,而不太重要的流可以设置为低优先级,占用更少的带宽并以较低的分辨率播放。 当网络条件不佳时,系统会根据各个流的优先级自动调整相应的分辨率,为用户保障重要内容的质量。