easydss系统HLS客户端在线数量统计原理

1. 首先了解HLS的工作流程

了解HLS协议的人都知道HLS的全称是http live stream,是一种基于http下载的流媒体协议。 hls协议中涉及到两种文件,m3u8文件和TS文件。

  • m3u8是文本文件,m3u8文件可分为两种:一种是内容是可下载的TS文件地址,另一种是内容为其他的m3u8文件地址(这种m3u8文件会在下文中讨论)。

  • TS文件是可直接用来播放的媒体文件。

服务器的行为是:将直播流缓存成一个个独立的TS文件分片,同时不停更新m3u8文件内容,保证m3u8文件中保存最新的TS文件地址。

播放器的行为是:

第一步:定时更新(下载)m3u8文件,并且解析出其中每个TS文件的网络地址。

第二步:将解析出来的TS文件下载下来。

第三步:解码播放TS文件。

这样客户端只要不停重复以上三个步骤就能实现持续播放。

sequenceDiagram
播放器A->>HLS服务器: 请求m3u8文件
HLS服务器->>播放器A: 返回m3u8文件
播放器A->>HLS服务器: 请求TS文件
HLS服务器->>播放器A: 返回TS文件
播放器A->>HLS服务器: 请求m3u8文件
HLS服务器->>播放器A: 返回m3u8文件
播放器A->>HLS服务器: 请求TS文件
HLS服务器->>播放器A: 返回TS文件
播放器A->>HLS服务器: 不停重复以上流程
HLS服务器->>播放器A: 不停重复以上流程

2. 认清我们所面临的根本问题是什么

由于绝大部分客户端下载文件的时候使用的是http短连接,当多个客户端同时播放同一路hls直播的时候http请求没有任何客户端标识,服务器是无法判断出当前的http请求是哪个客户端发出的,统计当前有几个客户端在发送http请求也就无从谈起。 我们需要做的就是想办法标识出不同客户端发来的http请求,从而让服务器区分出不同客户端的请求。

3. 解决办法1——http 302重定向

http标准协议中有这么一项,当客户端收到http服务器的返回码为302的时候就去解析http头中的location字段,该字段的值为新的url连接,客户端拿到新的url连接之后就转而向新url发送http请求。

基于这个原理,我们的服务器可以在客户端第一次请求m3u8文件的时候,服务器就生成一个uuid,作为url参数组装一个新的url,然后向客户端返回302。客户端收到新url之后就会使用新的url,由于新url中有唯一码uuid,服务器就可以通过uuid区分客户端。

从下图可以看出只有第一次请求是没有uuid参数的,服务器维护一张表记录下都有哪些uuid存在。当规定时间内如果某一个uuid没有请求,就认为对应的客户端停止了播放。通过这种方法可以很好地统计出有多少客户端正在播放。

sequenceDiagram
客户端->>服务器: 请求http://ip/hls/s.m3u8
服务器->>客户端: 302 返回新url(http://ip/hls/s.m3u8?uuid=xxx)
客户端->>服务器: 请求http://ip/hls/s.m3u8?uuid=xxx
服务器->>客户端: 返回m3u8文件
客户端->>服务器: 请求ts文件
服务器->>客户端: 返回ts文件
客户端->>服务器: 请求http://ip/hls/s.m3u8?uuid=xxx
服务器->>客户端: 返回m3u8文件
客户端->>服务器: 请求ts文件
服务器->>客户端: 返回ts文件

3. 解决办法2——嵌套型的m3u8

先上一段嵌套型的m3u8,客户端收到嵌套型的m3u8之后会从中根据带宽情况选取一条新的url连接,以后都会只请求这条m3u8。如果m3u8中只有一条子m3u8的话客户端就会只选择唯一的一条子m3u8地址作为播放地址,我们只需在子m3u8的url后面添加uuid,就可以达到方法一中的效果。

普通嵌套型的m3u8

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="...",AUDIO="aac"
low/video-only.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,CODECS="...",AUDIO="aac"
mid/video-only.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=7680000,CODECS="...",AUDIO="aac"
hi/video-only.m3u8

easydss的嵌套m3u8

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000
stream-name.m3u8?uuid=xxx

以上就是两种统计客户端数量的方法,总体思想就是标记出不同客户端的请求。 easydss已经很好地支持hls在线数统计功能。更多直播和点播方案可以在easydss网站找到答案。

更多开源流媒体技术,请关注我们的微信:EasyDarwin

输入图片说明

转载于:https://my.oschina.net/cczjp89/blog/1540843

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值