大多数浏览器和
Developer App 均支持流媒体播放。
-
探索 AVFoundation 中的媒体性能指标
探索如何利用新的媒体性能 API 来监测、分析并改进用户体验。了解如何使用不同的 AVMetricEvents 来监测音视频播放器在 HLS 素材方面的性能,并学习如何利用这些指标来理解播放器性能问题,以及进行相关分类。
章节
- 0:00 - Introduction
- 1:33 - What are events?
- 5:36 - Subscribing to events
资源
-
下载
大家好 我叫 Nishant 是一名 AVFoundation HLS 工程师 很高兴为大家介绍 我们在研究的功能 今天 我们将了解一种 收集媒体性能指标的新方式 在 iOS 18 中 这些指标表示为事件 我们将探索事件、不同类型 稍后我们将了解你的 App 如何订阅这些事件 首先我们先来了解 媒体播放的一些常见问题 第一个问题是 媒体播放启动花的时间太长 另一个问题是播放过程中的卡顿
要在现场对这些问题 进行分类很困难 但如果我们能够获得客户端指标 这就会简单的多 除此之外 客户端指标 可让我们深入了解 AVFoundation API 的工作原理 这有助于了解和改善性能
之前 对于媒体播放 你可以通过访问日志、错误日志和 各种 AVPlayer 通知 获取一些客户端指标 在 iOS 18 中 对于 HLS 流媒体资源 我们正在优化可用的指标 并提供更多数据点 现在我们来探索其中的一些新指标 我们将研究遇到媒体播放问题 的媒体播放会话 这是一个视频播放时间线 时长 15 分钟 放大前两秒 我们可以看到 启动过程中发生的情况 首先 AVPlayer 会开始获取 多变体播放列表 这在时间线上显示为一个事件
然后 AVPlayer 会获取视频、 音频和字幕播放列表 它们同样显示为时间线上的事件 在媒体播放列表中 AVPlayer 会提取媒体片段 以及任何必要的内容密钥 当 AVPlayer 缓冲了足够的内容后 便达到了可以继续播放的阶段 这在时间线上表示为 “可能保持”事件 这个事件提供了启动时间 以及影响启动的因素的详细信息 例如相关播放列表、 媒体片段和内容密钥事件 我们可以看到启动 花费了将近 2 秒时间
由于启动时间较长 我们来查看前面的事件 我们发现大多数启动时间 花在了等待内容密钥请求 我们要么需要提高 密钥服务器的性能 要么尝试在播放前 在客户端预加载密钥 这将有助于缩短启动时间 借助客户端指标 你现在了解了 AVFoundation 播放会话中 发生的情况
接下来 我们来看另一个问题 即媒体播放卡顿 将时间线放大到第 7 至第 8 分钟 我们可以看到发生了卡顿
这在时间线上表示为一个事件
我们来看卡顿前发生的事件 可以看到 AVPlayer 正在获取媒体片段 仔细看可以发现 视频媒体片段似乎返回了 HTTP 404 错误 这解释了变体切换从 20Mbps 变为 15Mbps 的原因
在变体切换之后 新变体中的视频媒体片段 再次返回 HTTP 404 错误 此时 AVPlayer 的 缓冲内容不足 从而导致卡顿
由于能够访问媒体片段事件 我们现在可以获取 NSURLSessionTask 指标的参考 这可以提供关于请求失败原因 的更多详细信息 比如完整的响应头 以及其他网络事务详细信息 我们可以使用这些信息和会话 标识符来更精确地定位问题 从而为 CDN 合作伙伴提供支持 通过这种方式 你可以在现场 使用客户端指标对问题进行分类
最后 如果你想大规模监控会话 AVPlayer 还会在结束时 创建一个摘要事件 这个事件提供不同的关键性能指标 例如会话卡顿次数、切换次数 统统一目了然 你可以使用这些 KPI 大规模追踪媒体播放健康状况 总结一下 我们查看了播放列表、 媒体片段和内容密钥事件 它们提供了单个资源请求的 相关信息 然后我们查看了 卡顿和变体切换事件 它们提供了媒体播放卡顿 和变体切换的相关信息 最后我们查看了 包含 KPI 的摘要事件 除此之外 每当播放速度发生变化 AVPlayerItem 会生成速度变化事件 当用户寻求时 生成寻求事件 当发生错误时 生成错误事件 现在 我们来了解 App 如何订阅 从而接收这些事件 在 iOS 18 中 我们将推出 一个新的 AVFoundation API 称为 AVMetrics 它提供了一种统一的方式 可从不同的 AVFoundation 接口 收集指标 当媒体时间线上发生事件时 你的 App 会收到相应的事件 事件在特定活动结束时生成 比如媒体播放列表获取 它采用发布者/订阅者模型 你可以仅订阅 你感兴趣的事件 现在我们来了解一些核心概念 发布者是支持发布事件的 AVFoundation 接口 它们遵守 AVMetricEventStreamPublisher 协议 这个协议支持发布 特定指标事件类型 或所有指标的事件 在 iOS 18 中 AVPlayerItem 遵守 AVMetricEventStreamPublisher 协议 这意味着它可以发布事件 我们来看一个例子 在这个例子中 我们想要了解 “可能保持”和“摘要事件” 然后将这些事件报告给 我们的后端分析服务器 首先我们抓取 “可能保持”和“摘要事件”的 AVMetrics 异步序列流 然后我们会创建 按时间顺序合并的流 合并后的流会 按时间顺序高效地发送 “可能保持”和“摘要事件” 收到事件后 我们可以将事件序列化 并将事件发送到后端分析服务器
如果你是 Objective-C 开发者 AVMetrics API 会略有不同 在这里你会创建 AVMetricEventStream 实例 并设置你的订阅者 之后就可以订阅感兴趣的事件
然后你将添加 AVPlayerItem 此时 你的订阅者 将开始接收这些事件
你将这些事件序列化 以便发送到后端服务器 这样 我们便可以了解 App 如何订阅客户端指标 并向后端分析服务器 报告客户端指标 总结一下 我们探索了 AVPlayer 的客户端指标、 各种不同的事件类型 然后我们了解了 App 如何 订阅以接收这些指标 我们期待你在 App 中 采用这个新的 API 希望更丰富的客户端分析 可以帮助你在现场进行问题分类 并提升媒体播放性能 为用户带来出色体验 谢谢大家
-
-
6:27 - AVMetric Publishers
public protocol AVMetricEventStreamPublisher { func metrics<MetricType: AVMetricEvent>(forType metricType: MetricType.Type) -> AVMetrics<MetricType> func allMetrics() -> AVMetrics<AVMetricEvent> } extension AVPlayerItem : AVMetricEventStreamPublisher
-
6:50 - Example showing how to obtain likely to keep up and summary metrics from AVPlayerItem - Swift
let playerItem : AVPlayerItem = ... let ltkuMetrics = item.metrics(forType: AVMetricPlayerItemLikelyToKeepUpEvent.self) let summaryMetrics = item.metrics(forType: AVMetricPlayerItemPlaybackSummaryEvent.self) for await (metricEvent, publisher) in ltkuMetrics.chronologicalMerge(with: summaryMetrics) { // send metricEvent to server }
-
7:26 - Example showing how to obtain likely to keep up and summary metrics from AVPlayerItem - Objective-C
AVPlayerItem *item = ... AVMetricEventStream *eventStream = [AVMetricEventStream eventStream]; id<AVMetricEventStreamSubscriber> subscriber = [[MyMetricSubscriber alloc] init]; [eventStream setSubscriber:subscriber queue:mySerialQueue] [eventStream subscribeToMetricEvent:[AVMetricPlayerItemLikelyToKeepUpEvent class]]; [eventStream subscribeToMetricEvent:[AVMetricPlayerItemPlaybackSummaryEvent class]]; [eventStream addPublisher:item];
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。