大多数浏览器和
Developer App 均支持流媒体播放。
-
HLS 插播式广告的新功能
HLS 插播式广告可以帮助您在广告、其他插播式广告和您的 HLS 流媒体之间实现视频内容的无缝转换。了解如何优化您的广告版位,在使用 HLS 时通过 SNAP-IN/OUT 对插播式广告进行微调,等等。
资源
相关视频
WWDC22
WWDC21
-
下载
大家好 我是 Prashant 欢迎来到 WWDC 2021 年 我们推出了 HLS Interstitials 可在您的 HLS 流中 简单地加入广告 和其它插屏 今年 我们新增了 让您更好地优化广告位 同时调整展示方式的功能 来 我们一起看看 HLS Interstitials 有什么新内容吧 在这次讲座中 我们先快速回顾下 HLS Interstitials 是如何运作的 接着 我们来讨论下新增的 广告提示选项 随后 我们来看下您可以如何 调整广告体验 尤其在使用 SNAP 属性的 直播场景中 然后 我们看下 HLS specification 中新增的 一些查询参数 最后 我们来探讨在这些新功能下 AVFoundation APIs 中的 具体改变 但在我们了解新功能前 先快速回顾下 HLS interstitials 有了 HLS Interstitials 广告可以被当作一种独立的资产来处理 它可以被加入到一条编程时间线 不再需要链接非连续的标签 相反 它们可以直接通过 多元播放列表直接引用 这让广告的安排更简单 因为您只需 从您的主要内容指向 多元播放列表即可
这是典型的媒体播放列表 显示主要内容时间线 假设您要在回放期间 安排两个广告 您想要第一个广告 在回放大约 5 秒后出现 那您只要用 DATE-RANGE 标签 指定广告的开始时间
而第二个广告在 15 秒时出现 那就在播放列表加入 另一个标签 就这么简单
也可能您的主要内容里 已经有一些嵌入广告了 您甚至可以通过指定一个 等同于这些内嵌广告时长的 resume offset 来替换这些广告
此外 HLS interstitials 还可让您 为广告指定导航限制 您甚至可以在直播场景中 安排复位 和其它方面 您可查看 WWDC 2021 的 “Dynamically insert midrolls and prerolls in HLS” 以获得更多信息 虽然您可以顺着内容时间线 安排广告 但今年 我们还新增了 强制将广告放置在 回放开始或结束的属性 因此 我们增加了以下新提示选项 您可指定 CUE 属性 这一属性以下值的其中之一 或组合 PRE 值可以让广告 在主要内容开始前出现 在直播场景中 如果您想在 节目开始前 安排一个优质广告位 这就尤为有用 POST 值指示广告在 主要内容后出现 这在您安排片尾字幕的事件流中 会比较有用 比如实时事件的结尾 ONCE 值可让广告 只出现一次 如果用户再退回到广告之前 则不会再看到该广告 分级屏幕是一个很好的应用 典型的在回放开始时 只播放一次的例子
这里是一个播放列表的例子 您的广告可以安排为 前贴片广告和后贴片广告 注意前贴片广告仅播放一次 在回放开始大约 10 秒后 我们也安排了一则单次广告
现在 在直播场景中安排广告 也面临着一系列的挑战 比如 您的对象包装程序 可能只用了一个 clock 函数 来设置播放列表中的 程序日期时间标签 而生成媒体的解码器 是由另一个 clock 函数生成的 现在 这两个 clock 函数 不一定要同步 比如 在这个示例中 片段 0 和片段 100 之间 日期时间标签区别大约是 800 秒
然而 聚合媒体持续时间与之相比 会略少 因为个别片段持续时间 在 8 秒以下
在这样的场景中 您的对象包装程序 clock 函数 比解码器的 clock 函数略快 实际广告开始的媒体时间 可能在 slate 中的某处 如果您想从偏移位置 即和这里展示的广告持续时长一样处 开始加入主内容 实际上 结果您是丢失了 跟随 slate 的一些主要内容
您现在可使用 SNAP 属性 和 OUT 值 在最接近预期广告时间的 段边界上 摆脱主要内容 同样地 用 SNAP 属性和 IN 值 来迅速跳回最接近 广告返回时间的主要内容处 注意 我们希望您仅在 直播场景 使用 SNAP 属性 因为在处理预打包需求内容时 clock 函数偏移是不存在的
这里是一个直播的播放列表 广告安排有流出和流入 今年 我们也增加了一些咨询参数 可帮助优化广告库存 以及优化会话管理 现在 您在 Ad pod 中 转变成了直播流转 您会很有兴趣知道 ad pod 现在进展到第几步了 因此在剩余的时间里 可以展示您最优价值的存货
我们添加了 HLS_start_offset 参数 _HLS_start_offset 咨询参数 只提供插页式广告 Asset-list URL 的请求 在直播内容方面 这可向 asset-list 指定偏移 回放在加入直播流时再次响起 对于有需求内容的视频来说 它将会是寻找用插屏广告的 替代位置时 Asset-list列表的偏移地址
在这一样本中 我们有一个 实时播放列表 有 15 秒广告 在播放列表顶部 安排在 5 秒后开始 这里突出的片段 将会被插页式广告取代 现在在实时加入中 典型的客户是直播边缘背后 大约 3 个目标的时长 此时已经安排好的 15 秒 ad pod 可能播放了 10 秒 这就是 HLS_Start_offset 咨询参数的一部分 现在客户只有 5 秒的 剩余广告时间了 服务器可以构建 asset-list 因此清单上最后 5 秒 就播放了最有价值的广告
在您的服务器中 您可以能需要一个方法 来在多重请求下 跟踪一些回放的会话 这样您不会一个广告 重复看很多遍 因此 要将广告请求 与主要回放会话连接 我们添加了 HLS_primary_id 查询参数 如果为了特定的回放会话的 所有 http 请求 客户设置回放会话 id 请求 header 然后他们可以将该部分 ID 作为 _HLS_primary_id 查询参数的一部分 到 X-Asset-URI 和 X-Asset-List 请求 不用设置会话 id 请求 header 的顾客 应为每个主要回放会话 创建一个独立的值 将其作为 _HLS_primary_id 查询参数 来使用 不管是主要还是插页式广告资产 您可能调用了 AVFoundation 提供 AVPlayerInterstitialController 和 AVPlayerInterstitialEvent 对象 让您从客户的角度计划广告 现在我们也增加了对提示 和 SNAP 选项的支持 以及 AVPlayerInterstitialEvent 对象 您可以通过 Cue 属性指定 提示选项 不管广告是要 前贴片广告还是后贴片 通过日期范围标签中的 Cue 属性发出播放一次的信号选项 通过 willPlayOnce property 设置为布尔值 选项到 Snap-Out 是通过 alignsStartWithPrimarySegmentBoundary 属性发出信号的 要 Snap-in 您要设置 alignsResumptionWithPrimarySegmentBoundary 属性
随着 AVPlayerInterstitialEvent 持续增长 我们认为将其从对象创建中 将其属性设置独立开来最好 因此 我们现在 做了 AVPlayerInterstitialEvent 可变对象 您现在可以创建只有 主要项目的对象 以及事件的开始时间 然后 您可以通过 设置相关的属性 指定不同的配置选项 注意一旦事件在控制面板中 设置好 事件对象任何后续变动 都不会反映在控制面板上 由于控制面板已经做了 这些对象的副本 要让改变生效 您要再次在控制面板上 设置事件 总而言之 您现在可以 使用 X-CUE 属性 将广告计划为前贴片 或后贴片广告 您也可以通过设置 X-CUE 为 1 次 强制让广告只播放一次 要管理直播场景中的偏移 您可以使用 X-SNAP 属性 在实时加入期间 要构建您的 asset lists 您可以使用 _HLS_start_offset 查询参数 您可以使用 HLS_primary_id 查询参数 来联系主要回放会话中的 插页式广告请求 您知道如果用 HLS interstitials 来安排广告 AVFoundation 是否会 在 Shareplay 中管理它们 您可查看“Display ads and other interstitials in SharePlay” 以获得更多 关于 SharePlay”的信息 以上是我的全部内容 感谢大家的观看
-
-
7:58 - Client schedules an ad pod at 10s into primary asset
// Client schedules an ad pod at 10s into primary asset let player = AVPlayer( url: movieURL ) // no ads in primary asset let controller = AVPlayerInterstitialEventController( primaryPlayer: player ) let adPodTemplates = [AVPlayerItem( url: ad1URL ), AVPlayerItem( url: ad2URL )] let event = AVPlayerInterstitialEvent( primaryItem: player.currentItem, time: CMTime( seconds: 10, preferredTimescale: 1 ), ) event.templateItems = adPodTemplates event.identifier = "Ad1" event.restrictions = [] event.resumptionOffset = .zero event.playoutLimit = .invalid event.cue = .none controller.events = [event] player.currentItem.translatesPlayerInterstitialEvents = true let vc = AVPlayerViewController() vc.player = player player.play()
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。