在七牛做直播 SDK 一年多了,帮助客户解决过各种形形色色的问题,如直播卡顿、马赛克、花屏、黑屏、杂音、音画不同步等等等等,这其中,有一些是网络原因,有一些是客户的使用姿势问题,有一些是参数配置错误,当然,也有一些是 SDK 本身的问题。
总结下来,如果开发者能够对直播领域的一些基础知识有更深入的了解,掌握一些基本的排障手段,很多问题是能够很快自行解决的,甚至也能够更好地防患于未然。
因此,有了这个系列,我想把这一年多以来,帮助我们的直播客户排查问题的实战经验逐步分享出来,同时也会穿插一些音视频开发的基础知识和优化经验,真心希望能够帮助到直播领域的开发者们。
本系列会涵盖的内容包括但不限于如下一些主题:
- 播放失败
- 直播卡顿
- 首开慢
- 延时高
- 音画不同步
- 马赛克严重
- 播放黑屏、花屏、绿屏
- 播放杂音、噪音、回声
- 点播拖动不准
- 直播发热问题
- 其他问题(待续)
本文是 《直播疑难杂症排查》系列的第二篇文章,我们主要分析下如何排查播放卡顿问题。
播放卡顿的表现
播放卡顿的表现总结下来包括但不限于以下这些:
频繁出现缓冲
播放不够流畅,画面一卡一卡的
常见播放卡顿问题排查
从代码层面来看,什么是卡顿?其实是指播放器渲染的帧率太低,比如:1s 显示 3~5 帧,或者渲染完一帧后,过很久才渲染下一帧。
因此,我们需要排查,是什么原因导致了播放器无法流畅地渲染数据,通常可能有如下几大类:
网络带宽不足
播放设备性能不足
视频流时间戳问题
下面我们一一来分析下具体的原因。
原因一:网络带宽不足
一个完整的直播应用,简单来说数据流是这样的:主播 -> CDN -> 观众
因此,直播出现卡顿,三个端都可能是问题的源头:
- 主播端的网络不好,导致推流上行不稳定
- 服务端的线路质量不好,导致分发不稳定
- 观众端的网络不好,导致拉流下行不稳定
那么,我们如何确切地判断是哪一个环节出了问题导致的播放卡顿呢 ?
如何判断主播网络不好
主播端网络不好,直接影响到的就是千千万万的观众,因此,如果发现所有的观众都出现频繁卡顿,那么多半就是主播端的问题了。
带宽测试
用带宽测试工具www.speedtest.net/ 测试下主播的带宽,如果主播的上行带宽明显小于推流的码率,那么肯定会出现推流帧率不稳定。统计回调
一般的推流 SDK 都会统计主播推流的实时视频帧率,如果预设的帧率是 20 fps,但是实际的帧率低得很多,比如 5 fps,排除手机性能低的原因的话,多半也是网络带宽不足引起的。CDN 厂商给出的后台统计
比如,七牛直播云就给我们的每一个客户提供了如下的后台 Portal 界面,可以用于监控每一个主播的实时推流情况:
从这个图来看,该主播的推流上行其实还是蛮稳定的,一直在 20 fps 左右。
如何判断观众端网络不好
观众是整个直播的终端环节,一般如果不是大面积的观众出现卡顿,那么很可能是这个观众自身的网络问题,可以考虑切换到别的 WiFi 网络,或者 4G 下播放试试,我们还可以通过如下手段,具体确认下是网络的原因。
带宽测试
跟主播端类似,我们依然可以用带宽测试工具,测试下观众端的带宽,如果该观众的带宽明显低于主播的推流码率,那么肯定会出现卡顿。网络质量测试
可以在观众端的网络下,ping 一下播放域名,看看当前丢包率是多少,一般好的网络,ping 值的丢包率是 0%。
当然,还有一些更加专业的网络性能测试工具,如 iperf,这里就不展开详细的介绍了。
- 如何判断 CDN 线路不好
如果排除了主播端上行网络原因以及观众端下行的网络原因,那么,剩下的就很可能是 CDN 线路质量原因了。
关于 CDN 线路质量,一方面可以通过联系 CDN 厂商来排查,另一方面,也可以通过播放端的打点上报,统计出各家 CDN 的线路质量(比如:首开,卡顿率),分地区做一些线路的调整和优化。
七牛实时流网络 (LiveNet)会根据网络流量、各节点的连接、负载状况及到用户网络的响应时间等综合信息,实时地将用户的请求调度到最佳服务节点上,同时可计算出最佳服务节点与视频源节点的最佳网络路径,使用户可以更快速的获取到视频内容,提高视频服务的响应速度和用户体验。
原因二:播放设备性能不足
越高清的码率,对解码的要求也越高,很多手机性能不足以支撑 720P 甚至 1080P 的视频解码,特别是很多低端的 Android 手机,因此导致实际解码播放的帧率远小于视频码流的实际帧率,从而产生卡顿。
解决这个问题的思路主要有如下几个方面:
- 尽可能选择使用硬解,充分利用 GPU 加速
- 如果有多种码流,尽可能在低端机上选择非高清码流
- 增大缓冲区,有助于缓解解码不稳定带来的卡顿
原因三:视频流时间戳问题
这个问题也遇到的比较多,特别是客户自己写的推流 SDK 或者码流经过一些转码处理后,没有处理好音视频时间戳从而产生的问题。播放器一般是严格根据码流中的音视频的时间戳来做音画同步的,因此,如果码流中的音视频时间戳出现错误,肯定会影响到播放画面的渲染时机。
例如,曾经遇到一个流的时间戳信息如下:
可以看到,它的视频时间戳出现了「回退」,而播放器一般 master 主时钟是单调递增的,当后来的视频帧小于了当前的主时钟,播放器就会做丢帧处理,从而导致播放的视频帧率远低于实际码流中的视频帧率,从而产生卡顿现象。
这个问题的排查,大家可以修改 ffplay 源码,把读取到的每一帧音频、视频的时间戳打印出来看看,这里我给出对 ffplay 的修改 commit 记录,大家可以参考一下:
github.com/Jhuster/pil…
小结
关于播放卡顿的问题排查大致就介绍到这里了,下篇我们将对首开慢这个话题进行探讨。如果你对七牛直播云感兴趣,欢迎点击 t.cn/RXEcFlv 了解详情。
本文作者:卢俊@七牛云。如果有你感兴趣的问题,但是不在上述列表中,也可以来信 lujun.hust@gmail.com 交流,欢迎关注新浪微博 @卢_俊 或者 微信公众号 @Jhuster 获取最新的文章和资讯。