斗鱼 H5 直播原理解析,它是如何省了 80% 的 CDN 流量?

本文涉及的产品
云原生网关 MSE Higress,422元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 斗鱼 H5 直播原理解析,它是如何省了 80% 的 CDN 流量?

斗鱼直播相信大家都听说过,打开斗鱼官网就可以直接在浏览器中观看直播。那么斗鱼是如何实现浏览器视频直播的呢?本篇文章就来解析斗鱼是如何实现直播的,以及它是如何节省 80% 的 CDN 流量,要知道视频直播流量费并不便宜,斗鱼每个月光这些流量费都要支付几个亿,节省 CDN 流量就是省钱。

直播技术方案

在实际去斗鱼直播间调试视频直播之前,我就猜它肯定是使用 HTTP-FLV 方案来实现视频直播,因为国内几乎所有直播平台都是使用 HTTP-FLV 方案。

但是去斗鱼直播间并没有找到 .flv 的网络请求,而是找到了 .xs 的网络请求,如下图所示。

网络异常,图片无法展示
|

不过 .xs 网络请求的响应的 Content-Typevideo/x-flv,原来只是后缀不同,看来我猜的果真没错,斗鱼就是用的 HTTP-FLV。

HTTP+P2P FLV 拉流

不过为什么后缀是 .xs 而不是 .flv 呢?其实这里是因为斗鱼默认并不完全使用 HTTP 去拉流,而是采用 CDN 和 P2P 两种方式同时去拉流,.xs 并不是一个完整的 FLV 流,而是一个子 FLV 流。

进入斗鱼直播间,斗鱼首先会去请求一个完整的 FLV 流,等 P2P 连接好了再去切换成子流。这是因为 P2P 连接比较慢,如果走来就走 P2P,那么视频起播速度会非常慢。

网络异常,图片无法展示
|

上图中第二个连接就是一个完整的 FLV 流,等 P2P 连接成功后会断开连接去拉子流。

在 P2P 连接成功后,还可以在网络面板看到一个 WebSocket 连接,如下图所示,它是斗鱼用来推送其他正在观看当前流的用户的,这样播放器就可以直接从推送的用户这里拉流。

网络异常,图片无法展示
|

斗鱼 P2P 是基于 WebRTC 的 DataChannel,可以打开 chrome 的 WebRTC 的调试页面,可以看到有很多 WebRTC 连接,它可以接收其他用户分享的视频数据,自己也会共享当前下载到的视频数据给其他用户。

网络异常,图片无法展示
|

斗鱼将一个完整的直播流进行切片,分成一个个小的视频分片并进行编号(这样方便用户之间共享)然后将这些小分片分为多个子流,通过 HTTP 从 CDN 拉一路子流,然后通过 P2P 去其他用户那里拉其他的子流。

但是通过 P2P 从其他用户那里拉流并不是很稳定,例如其他用户可以能退出了直播间,或者网络出了问题,这样就会导致接收它分享的用户直播断流。为了提升直播稳定性,如果在一定时间内没有收到其他用户分享的数据,斗鱼播放器就会立刻从 CDN 去拉对应的子流,并且 WebSocket 也会推荐新的用户给播放器。

可以发现,加上 P2P 拉流,大大增加了直播的复杂度。但是它带来的好处也非常的明显,就是可以省钱,省到就是赚到!因为流量费非常的贵,斗鱼每个月光直播带宽都得花好几个亿。利用 P2P 从其他用户那里拉流可以节省大量流量,例如一个直播流分为两个子流,一个从 CDN 拉,一个从其他用户那里拉,这样理论上就可以节省 50% 的流量,而斗鱼将一个直播流分成 6 个子流,一个从 CDN 拉,其余 5 个全部从其他用户那里拉,理论上可以节省超过 80% 的直播流量!

当然 P2P 拉流也有一些缺点,例如直播延迟较高,不适用于低延迟直播场景,对用户电脑和带宽有一定消耗,因为除了从其他用户那里拉流,当前用户自己还要上传视频数据给其他用户。

如果你想关闭 P2P,也比较简单,可以在网络面板屏蔽下图中的地址即可。

网络异常,图片无法展示
|

屏蔽之后,斗鱼就只会从 CDN 拉流,不走 P2P,如下图所示,可以发现流的地址变成正常的 .flv 后缀。

网络异常,图片无法展示
|

无论是只使用 HTTP,还是使用 HTTP + P2P,它们的最终目的是获取 FLV 视频数据。

FLV 格式

FLV 视频格式是由 Adobe 公司开发,在 2003 年发布,用于视频文件在网络上传输。在 Flash 时代几乎所有流媒体平台都在使用 FLV 格式,但是随着 Flash 技术的淘汰,FLV 也跟着没落了,目前国外已经没有流媒体平台在使用 FLV 了,但是在国内 FLV 却广泛用于网络直播场景。

不像 Flash,H5 的 video 元素是无法播放 FLV 视频的,我们需要借助 MSE 来自己控制视频播放,具体原理是将 FLV 转封装成 FMP4 视频格式,然后交给 MSE 播放即可。

MSE 全称是 Media Source Extensions API,它是 Web 流媒体的基础,所有 Web 流媒体平台最终都会用到它,如果对它感兴趣,欢迎查看 流媒体视频基础 MSE 入门 & FFmpeg 制作视频预览缩略图和 fmp4

目前有开源的 flv.js 来帮我们完成这件事,查看斗鱼 dist 后代码,斗鱼也是使用的 flv.js,不过在之上加了很多自定义的代码,例如加上了 h265 编码的支持,flv.js 是不支持 h265 编码的,FLV 官方规范也不支持,但是业务又有这种需求,所以一般将 FLV 视频编码 ID 等于 12 当作 h265 的流。在斗鱼直播中如果发现直播流是 h265 编码并且浏览器不支持 h265,斗鱼会利用 WASM 来软解播放视频。

直播时移

对于赛事直播斗鱼是支持直播时移的,如下图所示。

网络异常,图片无法展示
|

但是这个播放器的进度条体验不是很好,进度条的高度只有 3px,鼠标非要精准的放上去,才能有 Hover 的效果,这是没那么容易做到的。这里推荐个好用开源的播放器进度条 ppbar,你可以把它集成到任何播放器中去,非常的好用。

斗鱼直播时移是基于 HLS 的,如果点击一下进度条,斗鱼播放器会黑一下,将 FLV 切换成 HLS。

网络异常,图片无法展示
|

在刚开始进入直播间拉流的时候,斗鱼播放器可以获取到服务器返回的一个时间戳,单位是秒,当用户点击进度条跳转到前 10 分钟时,就直接用当前时间减去 600 秒就得到了前 10 分钟视频的时间戳,然后会用这个时间戳去请求请求一个 getVodStream 接口获取到 HLS 时移流地址,获取到 HLS 过后,就和普通 HLS 直播一样去播放即可。

和 FLV 一样,要在浏览器中播放 HLS 流,同样需要 MSE API 来播放,目前可以借助开源的 hls.js 来在浏览器中播放 HLS 流。查看斗鱼 dist 过后的代码,斗鱼应该没有使用 hls.js,而是自己实现在浏览器中播放 HLS。

总结

这篇文章介绍了斗鱼 H5 直播技术的原理,斗鱼不仅使用国内常用的 HTTP-FLV 方案,还加入了 P2P 拉流,从而节省 CDN 流量。对于赛事直播,斗鱼还支持直播时移,直播时移是使用 HLS 来实现的,用户在 seek 后会通过 seek 到的时间点去服务器换取对应的时移 HLS 流地址,然后走 HLS 拉流即可。

相关文章
|
8月前
|
安全 算法 网络协议
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
|
7月前
|
机器学习/深度学习 数据可视化 PyTorch
深入解析图神经网络注意力机制:数学原理与可视化实现
本文深入解析了图神经网络(GNNs)中自注意力机制的内部运作原理,通过可视化和数学推导揭示其工作机制。文章采用“位置-转移图”概念框架,并使用NumPy实现代码示例,逐步拆解自注意力层的计算过程。文中详细展示了从节点特征矩阵、邻接矩阵到生成注意力权重的具体步骤,并通过四个类(GAL1至GAL4)模拟了整个计算流程。最终,结合实际PyTorch Geometric库中的代码,对比分析了核心逻辑,为理解GNN自注意力机制提供了清晰的学习路径。
519 7
深入解析图神经网络注意力机制:数学原理与可视化实现
|
6月前
|
CDN
阿里云CDN怎么收费?看这一篇就够了,CDN不同计费模式收费价格全解析
阿里云CDN收费包含基础费用与增值费用。基础费用提供三种计费模式:按流量、带宽峰值及月结95带宽峰值计费,默认按流量计费,价格因地域和用量阶梯而异。增值费用涵盖静态HTTPS、QUIC请求、WAF防护及实时日志等服务,按需使用并单独计费。此外,可通过购买资源包预付费降低整体成本。更多详情参见阿里云官方文档。
1757 8
|
7月前
|
机器学习/深度学习 缓存 自然语言处理
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
Tiktokenizer 是一款现代分词工具,旨在高效、智能地将文本转换为机器可处理的离散单元(token)。它不仅超越了传统的空格分割和正则表达式匹配方法,还结合了上下文感知能力,适应复杂语言结构。Tiktokenizer 的核心特性包括自适应 token 分割、高效编码能力和出色的可扩展性,使其适用于从聊天机器人到大规模文本分析等多种应用场景。通过模块化设计,Tiktokenizer 确保了代码的可重用性和维护性,并在分词精度、处理效率和灵活性方面表现出色。此外,它支持多语言处理、表情符号识别和领域特定文本处理,能够应对各种复杂的文本输入需求。
923 6
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
|
8月前
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
540 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
7月前
|
传感器 人工智能 监控
反向寻车系统怎么做?基本原理与系统组成解析
本文通过反向寻车系统的核心组成部分与技术分析,阐述反向寻车系统的工作原理,适用于适用于商场停车场、医院停车场及火车站停车场等。如需获取智慧停车场反向寻车技术方案前往文章最下方获取,如有项目合作及技术交流欢迎私信作者。
491 2
|
7月前
|
缓存 边缘计算 安全
阿里云CDN:全球加速网络的实践创新与价值解析
在数字化浪潮下,用户体验成为企业竞争力的核心。阿里云CDN凭借技术创新与全球化布局,提供高效稳定的加速解决方案。其三层优化体系(智能调度、缓存策略、安全防护)确保低延迟和高命中率,覆盖2800+全球节点,支持电商、教育、游戏等行业,帮助企业节省带宽成本,提升加载速度和安全性。未来,阿里云CDN将继续引领内容分发的行业标准。
433 7
|
8月前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
931 12
|
7月前
|
人工智能 运维 监控
一招高效解析 Access Log,轻松应对泼天流量
一招高效解析 Access Log,轻松应对泼天流量
128 0
一招高效解析 Access Log,轻松应对泼天流量
|
8月前
|
开发框架 监控 JavaScript
解锁鸿蒙装饰器:应用、原理与优势全解析
ArkTS提供了多维度的状态管理机制。在UI开发框架中,与UI相关联的数据可以在组件内使用,也可以在不同组件层级间传递,比如父子组件之间、爷孙组件之间,还可以在应用全局范围内传递或跨设备传递。
189 2

推荐镜像

更多
  • DNS