《直播疑难杂症排查》之二:播放卡顿

七牛直播云在 2016 年 6 月发布以后,帮助广大客户解决过形形色色的问题,如直播卡顿、马赛克、花屏、黑屏、杂音、音画不一样步等等等等,这其中,有一些是网络缘由,有一些是开发者的使用姿式问题,有一些是参数配置错误,固然,也有一些是 SDK 自己的问题。git

总结下来,若是开发者可以对直播领域的一些基础知识有更深刻的了解,掌握一些基本的排障手段,不少问题是可以很快自行解决的,甚至也可以更好地防患于未然。github

所以,继《直播技术详解》系列文章以后,咱们推出了这个新的系列《直播疑难杂症排查》,咱们会把协助客户解决直播问题的经验逐步分享出来,同时也会穿插一些音视频开发的基础知识和优化经验,但愿可以帮助到直播领域的开发者们。微信


本系列会涵盖的内容包括但不限于以下一些主题:网络

  • 播放失败
  • 直播卡顿
  • 首开慢
  • 延时高
  • 音画不一样步
  • 马赛克严重
  • 播放黑屏、花屏、绿屏
  • 播放杂音、噪音、回声
  • 点播拖动不许
  • 直播发热问题
  • 其余问题(待续)

本文是 《直播疑难杂症排查》系列的第二篇文章,咱们主要分析下如何排查播放卡顿问题。工具


播放卡顿的表现

播放卡顿的表现总结下来包括但不限于如下这些:性能

  • 频繁出现缓冲测试

  • 播放不够流畅,画面一卡一卡的优化

常见播放卡顿问题排查

从代码层面来看,什么是卡顿?实际上是指播放器渲染的帧率过低,好比:1s 显示 3~5 帧,或者渲染完一帧后,过好久才渲染下一帧。.net

所以,咱们须要排查,是什么缘由致使了播放器没法流畅地渲染数据,一般可能有以下几大类:3d

  • 网络带宽不足

  • 播放设备性能不足

  • 视频流时间戳问题

下面咱们一一来分析下具体的缘由。

缘由一:网络带宽不足

一个完整的直播应用,简单来讲数据流是这样的:主播 -> CDN -> 观众

所以,直播出现卡顿,三个端均可能是问题的源头:

  1. 主播端的网络很差,致使推流上行不稳定
  2. 服务端的线路质量很差,致使分发不稳定
  3. 观众端的网络很差,致使拉流下行不稳定

那么,咱们如何确切地判断是哪个环节出了问题致使的播放卡顿呢 ?

如何判断主播网络很差

主播端网络很差,直接影响到的就是千千万万的观众,所以,若是发现全部的观众都出现频繁卡顿,那么多半就是主播端的问题了。

  1. 带宽测试
    用带宽测试工具http://www.speedtest.net/ 测试下主播的带宽,若是主播的上行带宽明显小于推流的码率,那么确定会出现推流帧率不稳定。

  2. 统计回调
    通常的推流 SDK 都会统计主播推流的实时视频帧率,若是预设的帧率是 20 fps,可是实际的帧率低得不少,好比 5 fps,排除手机性能低的缘由的话,多半也是网络带宽不足引发的。

  3. CDN 厂商给出的后台统计
    好比,七牛直播云就给咱们的每个客户提供了以下的后台 Portal 界面,能够用于监控每个主播的实时推流状况:

从这个图来看,该主播的推流上行其实仍是蛮稳定的,一直在 20 fps 左右。

如何判断观众端网络很差

观众是整个直播的终端环节,通常若是不是大面积的观众出现卡顿,那么极可能是这个观众自身的网络问题,能够考虑切换到别的 WiFi 网络,或者 4G 下播放试试,咱们还能够经过以下手段,具体确认下是网络的缘由。

  1. 带宽测试
    跟主播端相似,咱们依然能够用带宽测试工具,测试下观众端的带宽,若是该观众的带宽明显低于主播的推流码率,那么确定会出现卡顿。

  2. 网络质量测试
    能够在观众端的网络下,ping 一下播放域名,看看当前丢包率是多少,通常好的网络,ping 值的丢包率是 0%。

固然,还有一些更加专业的网络性能测试工具,如 iperf,这里就不展开详细的介绍了。

  1. 如何判断 CDN 线路很差
    若是排除了主播端上行网络缘由以及观众端下行的网络缘由,那么,剩下的就极可能是 CDN 线路质量缘由了。

关于 CDN 线路质量,一方面能够经过联系 CDN 厂商来排查,另外一方面,也能够经过播放端的打点上报,统计出各家 CDN 的线路质量(好比:首开,卡顿率),分地区作一些线路的调整和优化。

七牛实时流网络 (LiveNet)会根据网络流量、各节点的链接、负载情况及到用户网络的响应时间等综合信息,实时地将用户的请求调度到最佳服务节点上,同时可计算出最佳服务节点与视频源节点的最佳网络路径,使用户能够更快速的获取到视频内容,提升视频服务的响应速度和用户体验。

缘由二:播放设备性能不足

越高清的码率,对解码的要求也越高,不少手机性能不足以支撑 720P 甚至 1080P 的视频解码,特别是不少低端的 Android 手机,所以致使实际解码播放的帧率远小于视频码流的实际帧率,从而产生卡顿。

解决这个问题的思路主要有以下几个方面:

  • 尽量选择使用硬解,充分利用 GPU 加速
  • 若是有多种码流,尽量在低端机上选择非高清码流
  • 增大缓冲区,有助于缓解解码不稳定带来的卡顿

缘由三:视频流时间戳问题

这个问题也遇到的比较多,特别是客户本身写的推流 SDK 或者码流通过一些转码处理后,没有处理好音视频时间戳从而产生的问题。播放器通常是严格根据码流中的音视频的时间戳来作音画同步的,所以,若是码流中的音视频时间戳出现错误,确定会影响到播放画面的渲染时机。

例如,曾经遇到一个流的时间戳信息以下:

能够看到,它的视频时间戳出现了「回退」,而播放器通常 master 主时钟是单调递增的,当后来的视频帧小于了当前的主时钟,播放器就会作丢帧处理,从而致使播放的视频帧率远低于实际码流中的视频帧率,从而产生卡顿现象。

这个问题的排查,你们能够修改 ffplay 源码,把读取到的每一帧音频、视频的时间戳打印出来看看,这里我给出对 ffplay 的修改 commit 记录,你们能够参考一下:
https://github.com/Jhuster/pili-ffmpeg/commit/4d0476faba5016b291c2eed2c0a2cd6fe303bd50

小结

关于播放卡顿的问题排查大体就介绍到这里了,下篇咱们将对首开慢这个话题进行探讨。若是你对七牛直播云感兴趣,欢迎点击 http://t.cn/RXEtZrq 了解详情。


本文做者:卢俊@七牛云。若是有你感兴趣的问题,可是不在上述列表中,也能够来信 lujun.hust@gmail.com 交流,欢迎关注新浪微博 @卢_俊 或者 微信公众号 @Jhuster 获取最新的文章和资讯。

相关文章
相关标签/搜索