直播疑难杂症排查(2) — 播放卡顿

news/2024/11/13 3:46:40/

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

1. 播放卡顿的表现

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

  • 频繁出现缓冲
  • 播放不够流畅,画面一卡一卡的
2. 常见播放卡顿问题排查

从代码层面来看,什么是卡顿?其实是指播放器渲染的帧率太低,比如:1s 显示 3~5 帧,或者渲染完一帧后,过很久才渲染下一帧。
因此,我们需要排查,是什么原因导致了播放器无法流畅地渲染数据,通常可能有如下几大类:

  • 网络带宽不足
  • 播放设备性能不足
  • 视频流时间戳问题

下面我们一一来分析下具体的原因。

2.1 网络带宽不足

一个完整的直播应用,简单来说数据流是下面这样的:

主播 -> CDN -> 观众

因此,直播出现卡顿,三个端都可能是问题的源头:

  • 主播端的网络不好,导致推流上行不稳定
  • 服务端的线路质量不好,导致分发不稳定
  • 观众端的网络不好,导致拉流下行不稳定

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

2.1.1 如何判断主播网络不好
主播端网络不好,直接影响到的就是千千万万的观众,因此,如果发现所有的观众都出现频繁卡顿,那么多半就是主播端的问题了。

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

(2)统计回调
一般的推流 SDK 都会统计主播推流的实时视频帧率,如果预设的帧率是 20fps,但是实际的帧率低得很多,比如 5fps,排除手机性能低的原因的话,多半也是网络带宽不足引起的。

(3)CDN 厂商给出的后台统计
比如,七牛直播云就给我们的每一个客户提供了如下的后台 Portal 界面,可以用于监控每一个主播的实时推流情况:
在这里插入图片描述
从这个图来看,该主播的推流上行其实还是蛮稳定的,一直在 20 fps 左右。

2.1.2 如何判断观众端网络不好

观众是整个直播的终端环节,一般如果不是大面积的观众出现卡顿,那么很可能是这个观众自身的网络问题,可以考虑切换到别的 WiFi 网络,或者 4G 下播放试试,我们还可以通过如下手段,具体确认下是网络的原因

(1)带宽测试
跟主播端类似,我们依然可以用带宽测试工具,测试下观众端的带宽,如果该观众的带宽明显低于主播的推流码率,那么肯定会出现卡顿。

(2)网络质量测试
可以在观众端的网络下,ping 一下播放域名,看看当前丢包率是多少,一般好的网络,ping 值的丢包率是 0%
在这里插入图片描述
当然,还有一些更加专业的网络性能测试工具,如 iperf,这里就不展开详细的介绍了。

2.1.3 如何判断 CDN 线路不好
如果排除了主播端上行网络原因以及观众端下行的网络原因,那么,剩下的就很可能是 CDN 线路质量原因了。

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

2.2 播放设备性能不足

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

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

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

2.3 视频流时间戳问题

这个问题也遇到的比较多,特别是客户自己写的推流 SDK 或者码流经过一些转码处理后,没有处理好音视频时间戳从而产生的问题。播放器一般是严格根据码流中的音视频的时间戳来做音画同步的,因此,如果码流中的音视频时间戳出现错误,肯定会影响到播放画面的渲染时机。

例如,曾经遇到一个流的时间戳信息如下:
在这里插入图片描述

可以看到,它的视频时间戳出现了 “回退”,而播放器一般 master 主时钟是单调递增的,当后来的视频帧小于了当前的主时钟,播放器就会做丢帧处理,从而导致播放的视频帧率远低于实际码流中的视频帧率,从而产生卡顿现象。

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

3. 小结

关于播放卡顿的问题排查大致就介绍道这里了。

转载于:https://blog.51cto.com/ticktick/1919383


http://www.ppmy.cn/news/439225.html

相关文章

一文读懂直播卡顿优化那些事儿

动手点关注 干货不迷路 👆 希望本文可以带给大家一个相对全局的视角看待卡顿问题,认识到卡顿是什么、卡顿的成因、卡顿的分类、卡顿的优化和一些经验积累,有的放矢地解决 App 流畅性问题。接下来会从以下五个方面进行讲述: ✦什么…

【C++】C++11新特性重点:可变参数+lambda

C11新特性第二篇重点 文章目录 上一篇的补充一、可变参数模板二、lambda函数总结 前言 上一篇我们重点讲解了右值引用移动语义,关于移动构造和移动赋值还有一些需要补充的知识: 如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构…

[Spring Cloud]:Study Notes·壹

文章目录 摘要1 认识微服务1.1 单体架构与分布式架构1.2 分布式架构与微服务1.3 微服务架构 2 nacos2.1 什么是nacos2.2 nacos使用2.2.1 nacos使用逻辑2.2.2 启动下载好的nacos2.2.3 引入依赖2.2.4 各注册服务中配置nacos相关信息2.2.5 测试nacos注册成功 3 Ribbon负载均衡3.1 …

海尔w718刷机教程

作为一名小白用户,第一次刷机总是从茫然开始,但是过程却正如网友所言:恰如不断尝试以不同的方式去打开一扇窗户,那一次眼前的漫山遍野还真让人激动不已。 好了,废话不多说,贴教程,都是从网上汇…

海尔 条码全程应用

条码扫描就像一条纽带,把产品生命期中各阶段发生的信息实时取数,并实时追踪产品从生产到配送的全过程,使企业在最快的时间获得最准确的信息,通过正确的决策在激烈的市场竞争中处于有利地位。物畅其流,在整个庞大的海尔…

AMD——CPU微架构分析

一、SoC架构 1.1 整体架构 Zeppelin 参考链接:wikichip: Zeppelin 通过infinity fabric总线将单die分成多die的SoC架构,每个Die包含两个CPU核(CCX)、2各DDR通道、USB、低功耗IO以及多个IFOP和IFIS serdes接口。 如下所述中&…

网络安全进阶学习第二课——XSS漏洞

文章目录 一、前端安全1、什么是前端安全2、什么是Cookie3、Cookie的功能4、Cookie的生命周期5、常用的查看cookie插件6、XSS攻击能做什么 二、常被利用的前端代码三、JavaScript中常见的对象四、XSS原理五、XSS危害六、作为一名渗透人员(黑客)如何去挖掘…

初识Telegraf、InfluxDB和Grafana铁三角形成的监控可视化解决方案

文章目录 前言原始的监控靠人盯进化的监控靠批处理脚本高端的监控靠完整的可视化解决方案Telegraf、InfluxDB和Grafana铁三角TelegrafInfluxDBGrafana Grafana仪表板展示服务器资源总览负载和内存使用网络带宽磁盘IOIO延迟其他指标进程信息 总结 前言 数据监控目前用于各行各业…