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