[ WWDC2018 ] – 测量和优化HLS性可以 Measuring and Optimizing HLS Performance

作者 : 开心源码 本文共5507个字,预计阅读时间需要14分钟 发布时间: 2022-05-11 共71人阅读

需要提前理解一下HLS协议 官方 民间

HLS最优体验

1.内容可编辑 – 能选择播放列表多码率适配,支持新媒体格式(iframe),新的编解码器

2.应使用程序设计 – 用AVFoundation API开发整个Apple生态的应使用程序

3.交付 – 服务器配置方便而且性可以友好

结合你的内容、程序或者者交付变化,了解和量化使用户体验

能通过方法找到最优的配置

您将学习到什么?

1.创立一个通使用语言来形容流媒体服务质量

2.如何客观衡量你的应使用程序流媒体服务质量

3.定位并处理影响流媒体服务质量的问题

4.正确用主播放列表(Master Playlists)

一、流媒体直播回放过程解刨

  • 播放启动时长:从获取m3u8的主播列表,根据主播放列表信息获取符合当前播放环境的播放资源地址,而后下载对应TS切片(两级m3u8播放列表:第一级使用于支持多码率适配,第二级是才是播放切片列表),直到第一帧缓冲结束并能播放的时长。即是isPlaybackLikelyToKeepUp等于true的时候,启动完成

    AVPlayerItem.isPlaybackLikelyToKeepUp == true 
  • 播放中断(stall)时长:网络不佳的时候,缓冲区没有可播放的内容,等待缓冲完成达到重新可播放的间隔

  • 正常播放

二、量化流媒体播放体验主要指标

  • 播放启动时长

    当AVPlayer.status == .readyToPlay或者者AVPlayerItem.status == .readyToPlay时,并不是能立马播放。官方建议当AVPlayer.timeControlStatus == .playing 或者者 监听到AVPlayerItem.timebase的kCMTimebaseNotification_EffectiveRateChanged通知且CMTimebaseGetRate(AVPlayerItem.timebase) > 0时,即是真正能播放的状态。

    因而,点击播放到AVPlayer.timeControlStatus == .playing或者者CMTimebaseGetRate(AVPlayerItem.timebase) > 0的间隔即是播放启动时长。

  • 播放中断频率

    性可以指标:中断次数/总观看时长。监听AVPlayerItemPlaybackStalled通知,统计中断的频次。

  • 播放中断时长

    性可以指标:一律中断时长/总观看时长。监听AVPlayerItemPlaybackStalled发生到收到kCMTimebaseNotification_EffectiveRateChanged通知的间隔,即是一次中断的时长。

    //总观看时长计算代码var totalDurationWatched = 0.0if let accessLog = playerItem.accessLog() {    for event in accessLog.events {        if event.durationWatched > 0 {            totalDurationWatched += event.durationWatched        }    }}

    什么是AVPlayerItemAccessLog(上面代码中的playerItem.accessLog)?

    AVPlayerItemAccessLog - 整个播放过程的日志信息当收到AVPlayerItemNewAccessLogEntry通知时,即可以获取到日志AVPlayerItemAccessLog包含一组AVPlayerItemAccessLogEvent日志事件每个事件中记录了如下信息:URI 默认值nilindicatedBitrate 默认值-1observedBitrate 默认值-1numberOfBytesTransferred 默认值-1durationWatched 默认值-1
  • 整个流媒体质量

    性可以指标:时间加权指示比特率(Time-weighted Indicated Bitrate),即是正常整个播放时长内比特率时间加权平均值

    //时间加权指示比特率计算代码var timeWeightedIBR = 0.0if let accessLog = playerItem.accessLog(), totalDurationWatched > 0 {    for event in accessLog.events {        if event.durationWatched > 0 && event.indicatedBitrate > 0 {            let eventTimeWeight = event.durationWatched / totalDurationWatched            timeWeightedIBR += event.indicatedBitrate * eventTimeWeight        }    }}
  • 流媒体播放发送错误的频次

    性可以指标:发生错误的次数/一律播放次数。当AVPlayerItem.status == .failed,记录错误频次bing并并可通过AVPlayerItem.error获取错误信息

    AVPlayerItemErrorLog:通过错误日志衡量播放失败对使用户的影响。AVPlayerItemErrorLog里包含一组AVPlayerItemErrorLogEvent,每个event记录了错误产生的具体信息如下:

    date = 2018-06-16 15:04:41errorStatusCode = -12889errorDomain = "CoreMediaErrorDomain"errorComment = "No response for media file in 9.9767s"

使用户体验总结

使用户体验度量主要性可以指标
等待播放开始启动时长每次播放的启动时长
播放中断中断次数中断频率(中断次数/总观看时长)
中断等待中断时长一律中断时长/总观看时长
流媒体整体质量指示比特率时间加权指示比特率
播放失败播放错误发生错误的次数/一律播放次数

备注:(1)主要性可以指标在不同设施和用场景下是不可比较的
(2)收集流媒体度量信息时需要同时收集上下文信息(3)对收集的信息进行分类,找出对你的程序有益的信息

三、提升HLS的性可以

提升途径

  • 减少播放启动时长
  • 分析中断的起因,减少中断次数
  • 分析播放出错的起因,减少出错次数

播放启动时长优化

影响播放启动的因素

  1. AVAsset获取远程一级和二级m3u8文件,一级是主播放列表,根据当前播放环境选择最适合当前播放环境的播放列表地址(播放TS切片列表),即是二级m3u8文件地址,而后请求二级m3u8里的资源列表
  2. 下载资源缓冲
  3. 假如是加密流媒体,需要获取解密秘钥
  4. 假如有继续上一次播放功可以,重新定位播放时间点再次缓冲
  5. 可选配置,如选择切换语言或者者清晰度,需要重新获取对应的资源
测量播放启动时长
  • 记录API调使用和监听Player和PlayerItem状态变化时间戳,计算时间耗费
  • 通过系统提供的AVPlayerItemAccessLogEvent.startupTime获取启动时长
  • 从开始下载到AVPlayerItem.isPlaybackLikelyToKeepUp == true 的时间间隔
减少播放时长可选方法
  • 在使用户点击播放之前创立AVAsset,去除上面影响因素1的时间开销
  • 去除加密环节或者者采使用苹果提供的AVContentKeySession API进行秘钥解决
  • 假如可以预知使用户什么时候会触发播放,能提前seek历史进度。假如可以预知使用户的可选配置选项,能提前配置对应的信息的资源
  • 假如播放多个内容,建议用AVQueuePlayer。AVQueuePlayer会在前一个播放内容下载完成后,提前下载下一个播放内容

总的来说提前创立AVPlayItem和在创立AVPlayItem前设置播放器的播放速率,在使用户点击播放前提前设置预知信息,减少使用户不必要的等待时长。

影响网络缓冲时间的因素
  • 提供多样性的播放列表,如多种码率,分辨率和编码方式等
  • 播放内容的比特率(bitrate)
  • 目标播放列表的时长(每个TS切片的播放时长)
  • 网络带宽

那么减少启动网络缓冲的方法如下:

(1)启动阶段能选择先获取低比特率的内容减少网络缓冲时间但是需要牺牲初始的视频质量
(2)启动阶段选择合适的流媒体格式(HDR / SDR, HEVC / H.264, Stereo / DD / DD+)

播放中断优化

中断分析方法
  1. 中断消息监听

    //监听状态代码notificationCenter.addObserver(self,selector: #selector(handlePlaybackStalled(_:)),name: .AVPlayerItemPlaybackStalled, object: playerItem)
  2. 检测AVPlayerItem的状态,如AVPlayerItem.isPlaybackLikelyToKeepUp AVPlayerItemErrorLog

  3. AVPlayerItemErrorLog

  4. AVPlayerItemAccessLog

例子分析
  1. 网络带宽导致中断例子:

处理:提供全套比特率层级适配,每个编解码器组合都需要自己的全套比特率层级

  1. 内容创作和服务配置导致中断的例子

    处理:你的服务器和CND必需具备如下可以力

    (1)无推迟地传送媒体播放列表,内容切片和密钥

    (2)至少在每个目标持续时间升级播放列表

    (3)能同步播放列表之间的不连续序号

    (4)能清楚的指出服务端的错误信息

播放错误优化

播放错误分析方法
  1. 通过AVPlayerItem的AVPlayerItemErrorLog和AVPlayerItemAccessLog获取错误日志

  2. 监测AVPlayer和AVPlayerItem的错误属性,如AVPlayerItem.status and AVPlayerItem.error

    playerItemObserver = playerItem?.observe(\AVPlayerItem.status, options: [.new, .initial]) {     [weak self] (item, _) in    guard let strongSelf = self else { return }    if item.status == .failed {        let error = item.error        print(“AVPlayerItem Error: \(String(describing: error?.localizedDescription))”)        let errorLog = item.errorLog()        let lastErrorEvent = errorLog?.events.last    }   print(“ErrorLog: \(String(describing: lastErrorEvent?.description))”)}
    HDCP(High-bandwidth Digital Content Protection)高带宽数码内容保护流媒体错误监测AVPlayer.isOutputObscuredDueToInsufficientExternalProtection属性以下几种情况isOutputObscuredDueToInsufficientExternalProtection会发生改变1.当前播放内容需要外部保护2.当前设施跟保护等级不匹配3.使用户观察视频内容丢失处理:(1)需要适配非HDCP (2)App使用户界面可以够反馈属性发生变化
  3. 媒体流验证错误 — 用开发者网站上的媒体流验证器进行验证

四、Master Playlists正确打开姿势

HLS协议通过URI来获取playlist,playlist分为两级:第一级是Master PlayList 第二级是Media PlaylistMaster PlayList能了解成是配置列表,根据播放环境匹配最适合的Media Playlist。Media Playlist即是资源的播放TS切片。

正确用Master Playlists可以够提供流畅的播放体验 — “正确的做法是给我们提供你所拥有的一切“

媒体播放列表的峰值比特率是任何连续组片段的最大比特率,其总持续时间在目标持续时间的0.5和1.5倍之间。

  1. 如何保证播放器选择正确的播放流

    Master playList里的EXT-X-STREAM-INF tag需要提供下图中的信息。确保播放器可以够根据这些参数选择最适合播放环境的播放流

  1. 为什么快进或者者在当焦点停留Apple TV的进度条看不到图像

    EXT-X-I-FRAME-STREAM-INF:需要提供I帧(视频编解码独立的帧,解压时不依赖其余帧),I帧间隔越均匀,每帧之间的间隔越近,体验越好

  1. 如何支持多种语言

    支持两种语言例子

    AUTOSELECT和DEFAULT的区别

    AUTOSELECT:
    该次播放能自动选择
    通常,您希望将此设置设置为YES
    相似评论跟踪的场景能设置成NO

    DEFAULT:
    本次播放播放器的默认选择项
    一组中只有一个选项可以设置DEFAULT=YES
    前提必需AUTOSELECT=YES
    跟默认参数没有任何关系

  2. 如何支持多声道音频

    两种语言两种音频格式

  3. 如何支持多种音频比特率和多种格式

  4. 如何支持多种视频编解码格式

    设置CODECS参数

  5. 如何支持副标题和隐藏字幕

    TYPE=SUBTITLES
    TYPE=CLOSED-CAPTIONS

总结

  • 通过分析关键性可以指标(播放启动时长、中断频率、中断时长占比、时间加权指示比特率和发生播放错误频率)来确定HLS性可以。
  • 正确用系统提供的API(如AVPlayerItemAccessLog)来收集HLS播放日志,记得收集环境信息。
  • 正确用HLS的Master Playlists可以够提高使用户观看体验

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » [ WWDC2018 ] – 测量和优化HLS性可以 Measuring and Optimizing HLS Performance

发表回复