大多数浏览器和
Developer App 均支持流媒体播放。
-
探索隔空播放中的插片广告
了解如何在隔空播放中使用 HLS 插片广告实现视频内容在广告之间无缝过渡。我们将分享从 Apple 设备到流行的智能电视共享内容时创造卓越体验的最佳实践和技巧。
章节
- 0:00 - Overview
- 0:02 - Navigation restrictions
- 0:04 - Optimize AirPlay playback
- 0:06 - Interstitials localization
- 0:08 - Testing
- 0:10 - Example VOD plan
资源
- AirPlay-Enabled TVs and Video Accessories
- Getting Started with HLS Interstitials
- Media playback
- Supporting AirPlay in your app
相关视频
WWDC23
-
下载
♪ ♪
Amit:大家好 我是 Amit 我是 AirPlay 团队的一名工程师 我们创造的隔空播放可以让你 通过无线方式将视频、照片、音乐等 从 Apple 设备共享到 支持隔空播放的接收器上 有时候你可能希望 在播放 App 中的主要内容时 也能播放来自多个来源的次要内容 比如广告、即将发布的预告片等 这种次要内容被称为插片广告 如果你想确保 App 中的插片广告 有良好的隔空播放用户体验 那么本讲座正是你所需要的 本次内容将从隔空播放 和 HLS 插片广告的概述开始 之后 我们将讨论 如何将播放插片广告的 导航限制发送到隔空播放接收器上 然后 我们将介绍在设备上 优化隔空播放的最佳实践 我们会简要讨论插片广告定位 和隔空播放测试 最后 我们将介绍一个 使用 HLS 插片广告的 VOD 服务提供方案的例子 你可以通过以下方式使用隔空播放: 隔空播放音频 如果你有多个 HomePod 或支持隔空播放的扬声器 你可以在家里同步欣赏最喜欢的 音乐或播客 有关隔空播放音频的更多信息 你可以查看 我同事 Kelly 的讲座 “调整你的隔空播放音频体验” 隔空播放镜像可以将 iOS 或 macOS 屏幕上的任何内容 如网站、演示文稿 和电子表格 共享到隔空播放接收器上
隔空播放视频可以 帮助你无线发送视频 到支持隔空播放的电视上观看 包括 Apple TV、Mac 接收器 或支持隔空播放的智能电视 Apple TV 或支持隔空播放的电视 可以带来高质量的视频体验 它们支持高达 4K 的 HDR 视频和环绕声 对于 HLS 插片广告来说 广告被视为 在主要媒体资产时间线中 定义的独立资产 当媒体播放器的时间线到达标记时 我们将开始播放插片广告 HLS 插片广告可以针对 VOD 或 Live 主要内容来设定 而不需要对主要内容进行修改 插片广告可以在播放期间 动态地设定或取消 HLS 插片广告 允许后期绑定广告资产 你可以在主要内容 接近广告标记时 对广告进行判定 甚至重新绑定 例如 当人们导航到 他们已经观看过的 一段视频时 可以使用 HLS 插片广告 确保他们不会再看到同一个广告 HLS 插片广告提供对 隔空播放和画中画的内置支持 所有设定的广告和插片广告 都会传送到隔空播放对话中 HLS 插片广告可以 用于音频和流媒体视频播放服务
可以通过以下两种方式之一 设定 HLS 插片广告: 服务器驱动和客户端驱动 这两种方法在投放和控制 插片广告的 设置属性方面具有相似性 服务器可以将 EXT-X-DATERANGE 标签放置到 主要资产的媒体播放列表中 以此设定插片广告 App 代码可以通过 AVPlayerInterstitialEventMonitor 对象 来监控插片广告的设定和进度 App 代码可以使用 AVFoundation API 以编程方式设定插片广告 你可以通过创建 AVPlayerInterstitialEvent 对象来创建广告事件 AVPlayerInterstitialEvent 对象包含 在播放器项目时间线上 放置广告所需的所有信息 你可以在 AVPlayerInterstitialEventController 上设置 AVPlayerInterstitialEvent 的 所有对象 AVPlayerInterstitialEventController 为主要播放器播放的项目 设定插片广告事件 以下是 VOD 和 Live 内容的 播放流示例 正如你所看到的 我们有两个连续的广告资产 即 ad1 和 ad2 用于 VOD 和 Live 用例 在 VOD 用例中 播放内容会在中断的位置继续 在 Live 用例中 播放按广告消耗的时间向前转跳 主要内容的偏移量恢复 可以通过服务器驱动 或客户端驱动的方法来设置 对于服务器方法 主要内容的偏移量恢复 可以通过在 HLS 播放列表的 EXT-DATERANGE 标签中 设置 X-RESUME-OFFSET 属性来实现 对于客户端方法 偏移量恢复可以 通过 AVFoundation API 设置 也就是将 resumptionOffset 属性 设置为 AVPlayerInterstitialEvent 有关 HLS 播放列表属性 和 HLS 插片广告 AVFoundation API 的更多细节 请参阅本讲座下的参考链接
隔空播放视频提供内置控件 可在 iPhone 上的 App、 锁定屏幕 和控制中心显示 因此你可以轻松播放、暂停、 快进、倒带和调整电视音量 通过隔空播放 用户还可以 使用隔空播放接收器的遥控器 实现相同的远程控制操作 对于插片广告来说 通常出于合同原因 你要防止订阅者 跳转或跳过这些广告 HLS 插片广告内置了 对用户导航限制的支持 有两条明确定义的限制 跳过:跳过限制会阻止人们 不按照预期速率播放广告 跳转限制会阻止跳出当前广告 举例来说 如果浏览者想要越过多个插片广告 那么至少要播放一条插片广告 他才能完成跳过的请求
隔空播放开启期间 在设备或隔空播放接受器上播放时 导航限制会在 播放器 UI 级别强制执行 即 AVKit 或自定义 App 代码 导航限制可以采用以下组合: 跳过、跳转、跳过和跳转 与其他所有属性相似 插片广告导航限制可以通过 两种方法配置 服务器驱动:要使用服务器方法 配置导航限制 HLS 播放列表必须在 EXT-X-DATERANGE 标签下 设置 X-RESTRICT 属性 客户端驱动:用这个方法 App 代码应设置 AVPlayerInterstitial 对象的 属性限制 使用以上两种方法之一 你可以确保 在 Apple 设备上的本地播放 以及在隔空播放接收器上的 隔空播放会话 都对插片广告播放执行导航限制
隔空播放接收器是独立硬件 接收器可以是 Apple 或非 Apple 的设备 意味着所有的非 Apple 接收器 都没有执行 AVFoundation 代码 你可能会想到一个问题 App 是否需要进行任何代码更改 如配置任何特定属性 才能确保插片广告的导航限制 在隔空播放接收器上强制执行? 并不需要更改代码 导航限制是通过 我们之前说过的方法之一配置的 也就是在播放列表中设置 X-RESTRICT 属性的服务器驱动方法 或在 App 代码中设置 AVPlayerInterstitialEvent 对象 限制属性的客户端驱动方法 让我们来构建一个播放列表来演示 如何使用服务器方法处理跳过限制 也就是 HLS 播放列表
我们的播放列表 有十秒时间的主要资产 我们在这个播放列表中 更新两段连续的广告 这个更新将向播放列表 添加两个持续时间为十秒的广告 它们将在主要资产 播放到第五秒时开始播放 因为两段广告的开始时间是一样的 所以它们将按照 在播放列表中的顺序出现 在这个例子中 先播放 ad1 ad2 播放之后 播放器会从 主要资产停止的地方继续播放
请注意 X-RESTRICT 属性是在第一个 插片广告 ID 上设置的跳过 即 ad1 所以播放 第一个插片广告 ad1 时 就会应用跳过限制 但请注意第二个插片广告 ID 即 ad2 是没有导航限制的 也就是没有 X-RESTRICT 属性 这样设置可以 为你的广告方案增加灵活性
现在我们来看一下客户端方法 为了简化例子 我们只添加一个广告事件 即 ad1 我们为主要项目创建 AVPlayerInterstitialEvent 并设置事件开始时间 然后我们设置不同的配置选项 并在 ad1event 上设置跳过限制 最后 我们在 controller 上 设置 ad1event 我们来介绍一下 如何在接收器上优化隔空播放 很多接收器都支持隔空播放 包括 Apple TV、机顶盒、 流媒体棒、音箱、 智能扬声器和智能电视 隔空播放接收器有不同的硬件、软件 以及媒体处理能力 由于媒体处理能力不同 一些隔空播放接收器可能会在 媒体资产之间切换时有转换延迟 在一些隔空播放接收器上 转换延迟常见的原因之一是 将解码器从一种视频格式 切换到另一种格式所花费的时间 由于某些接收器 不同的媒体处理能力 解码器之间的这种切换 可能需要时间 这就会导致转换延迟 插片广告用例的一个例子就是 主要资产用 AVC 编码 而插片广告资产用 HEVC 编码
为了减少隔空播放接收器上 主要资产和插片广告媒体资产 之间的转换延迟 建议你在主要资产 和插片广告媒体资产之间 保持匹配的媒体操作参数 对视频资产来说 包括 视频编解码器、帧速率、纵横比 对音频资产来说 包括音频编解码器、 采样频率、分辨率、通道布局 为了确保主要内容 或插片广告内容同步 媒体组件的所有呈现单元 即音频、视频、字幕 必须在彼此的规范内 准确地加上时间戳并对齐 对于增加用户参与度 需要基于插片广告 语言种类的客户来说 可以为插片广告 指定匹配的音频和字幕音轨 如果插片广告和 主要资产的音频/字幕轨相似 那么在播放插片广告时 将采用自动轨道选择 自动选择对本地播放 和隔空播放对话均适用 无需更改代码 我们简要讨论一下 在流媒体 App 中 测试隔空播放的注意事项
在流媒体 App 中 测试隔空播放视频 你需要构建一个隔空播放发送器 和接收器的测试集 隔空播放视频发送器设备 包括 iPhone、iPad 和 Mac 隔空播放视频接收器 包括 Apple TV、Mac 以及上百种非 Apple TV 的接收器和智能电视 每种接收器在硬件、软件 和播放能力上都有不同 当用你的流媒体 App 测试隔空播放时 首选 Apple TV 作为接收器是一个好主意 但也强烈建议你从非 Apple 的 隔空播放接收器中 至少每类选一种设备测试 你可以根据媒体处理能力 进一步划分接收器设备 即高端和低端接收器 比如 如果你的流媒体服务 支持杜比视界 那么在验证 App 的隔空播放时 请在测试集中包含一个 支持杜比视界的隔空播放接收器 另外 请确保包含一个仅支持 SDR 和立体声 AAC 音频的 低端隔空播放接收器 要注意 即使你的流媒体 App 仅针对一类发送器设备 比如 iPhone 我们也强烈建议你构建一个 包含高端和低端接收器的测试集 选择测试的隔空播放接收器时 请参考不断增加的 Apple 商用设备列表 可在本次演讲的参考链接中找到 我们来看一个 VOD 方案的实例
例子中的服务提供商 希望提供三种服务方案 方案 A: 带有广告的 VOD 服务计划 其中播放/暂停是播放广告时 唯一允许的用户操作 方案 B: 没有广告的 VOD 服务计划 方案 C:加入该方案的订阅者 在初始广告结束后可跳过广告 在这个例子中 服务提供商希望在服务器上的 播放列表中 拥有插片广告支持的最大配置 而且服务提供商希望 所有的方案都使用相同的播放列表 我们将使用一个类似于之前我们用来 演示跳过限制的播放列表 仅作少量更改 在这个播放列表中 EXT-X-DATERANGE 标签设定了 两条广告 即 ad1 和 ad2 每条十秒钟 广告将在主要资产 播放五秒钟后开始播放 播放器会播放两条广告 然后从主要资产 停止的地方继续播放 两个广告事件上都有设置跳过限制 为了支持加入方案 A 的订阅者 也就是带广告的 VOD 服务 App 代码不需要更改 因为播放列表已经有了 支持插片广告的所有规则 为了支持方案 B 也就是不播放广告的方案 你可以在 App 代码中使用 以下 AVPlayerItem 属性: automaticallyHandlesInterstitialEvents 设置为 false 将这个属性 设置为 false 就会忽略 服务器在 EXT-X-DATERANGE 标签中 指定的 AVPlayerInterstitialEvents
对于方案 C 即加入这个方案的订阅者 在初始广告结束后就可以跳过广告 我们需要确保限制 保留在第一条广告上 即 ad1 必须在客户端 App 代码中进行修改 覆盖第二个插片广告 ad2 上 设置的限制属性 这样就可以移除跳过限制
这个示例代码展示了 如何使用 App 代码 覆盖 HLS 播放列表中 设置在 ad2 上的导航限制 为此 我们首先提取 ad1 和 ad2 的 AVPlayerInterstitialEvent 然后创建一个 ad2 事件的副本 再在副本上删除导航限制 最后我们用所有插片广告事件的 时间表更新 controller 即原始的 ad1Event 和 修改后的 ad2Event 副本 现在我们看一下演示视频 了解每个方案的订阅者体验 每次演示都指向 相同的 HLS 播放列表 其中包含一条主要内容 “厨师装饰饼干” 及两条广告 设定在主要内容的五秒处
首先是示例方案 A 的演示 我们开启隔空播放视频
这是主要内容
这是 ad1 时长十秒钟 因为服务器将跳过限制 设置在 HLS 播放列表上 订阅者无法跳过或快进这条广告 这是 ad2 因为订阅者也不能 跳过或快进这条广告 所以它也设置了跳过限制 主要内容从 设定 ad1 的偏移量恢复 注意 现在订阅者可以向前跳转了
第二段演示和之前的演示步骤相似 即隔空播放到电视上 我们将展示 方案 B 的订阅者体验 也就是不播放广告
我们用的 HLS 播放列表 和前一个演示是相同的 但五秒处不会看到设定的广告 因为在 App 代码中 我们将主要项的 automaticallyHandlesInterstitialEvents 属性设置为 false 了
现在我们跳转到最后一个演示 来展示方案 C 的订阅者体验 即订阅者可以 在初始广告结束后跳过广告 我们开始播放主要内容
这是 ad1 按照正常速率播放 订阅者无法跳过或快进这条广告
因为我们已经通过编程 删除了对第二条广告设置的限制 订阅者现在就可以跳过 ad2 了 一段洛杉矶的无人机摄影
总结一下这个实例 我们展示了 客户端 App 代码如何覆盖 服务器端插片广告的属性和配置 根据订阅方案 同一个 App 中的 客户端 App 代码 可以让 AVPlayer 设定插片广告 并强制执行服务器 在 HLS 播放列表中设置的属性 通过禁用服务器上 HLS 播放表中配置的 所有插片广告来进行完全覆盖 通过更新插片广告的 特定属性来进行部分覆盖
总结一下 你可以通过使用服务器方法 设定 HLS 插片广告 或者在客户 App 代码中 使用 AVFoundation API App 代码也可以覆盖 服务器端插片广告的属性和配置 为了确保导航限制同时适用于 本地播放和隔空播放对话 HLS 播放列表必须在 EXT-X-DATERANGE 标签中 设置 X-RESTRICT 属性 或在 App 代码中设置 AVPlayerInterstitialEvent 对象的 限制属性也可以起到同样作用 为了减少隔空播放接收器上 主要资产和插片广告媒体资产 之间的转换延迟 建议你在媒体资产之间 保持匹配的媒体操作参数 在测试你的流媒体 App 隔空播放时 请在测试集中包括 广泛的接收器种类 希望本次讲座能为你带来有用信息 谢谢
-
-
9:19 - Example: Navigation restriction client driven
let player = AVPlayer(url: movieURL) //no ads in primary let controller = AVPlayerInterstitialEventController( primaryPlayer: player ) let ad1Item = [AVPlayerItem(url: ad1Url)] let ad1event = AVPlayerInterstitialEvent( primaryItem: player.currentItem, time: CMTime(seconds: 5, preferredTimescale: 1) ) ad1event.identifier = "ad1" ad1event.templateItems = ad1Item //set SKIP restriction on ad1 ad1event.restrictions = [.requiresPlaybackAtPreferredRateForAdvancement] controller.events = [ad1event] code snippet.
-
15:44 - Plan C: Sample code to override the restrictions
let player = AVPlayer( url: movieURL ) let controller = AVPlayerInterstitialEventController( primaryPlayer: player ) let ad1Event = controller.events[0] let ad2Event = controller.events[1] let newEvent = ad2Event.copy() as! AVPlayerInterstitialEvent //clear the restrictions on ad2 event newEvent.restrictions = [] //set the original ad1 Event and modified ad2 Event on controller controller.events = [ad1Event, newEvent]
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。