背景:买了很多台带宽不到 1M/s 的服务器,想利用它们搭建一个视频网站
但是目前 H5 上的视频播放只实装了直链播放这种方式,这意味着任意时刻只能利用上其中一台服务器的带宽
请问有没有类似的技术可以实现按不同的 range 从多台服务器上共同取回一个视频片段然后合成给前端播放?
因为是网页不是客户端,没看到类似的解决方案,webrtc 能不能实现这种功能?
1
ruxuan1306 2022-03-20 21:14:41 +08:00
现在视频大都是 m3u8 分段列表,切细点,不同的端放在不同服务器可能可以。
|
2
ch2 OP @ruxuan1306 #1 也考虑过 m3u8 ,不过这样太死板了,每一个切片只能固定由一台服务器提供
|
3
anubu 2022-03-20 22:54:46 +08:00 1
记得有一个基于 bt 的播放器,可以考虑类似的实现。
|
4
anubu 2022-03-20 22:56:02 +08:00
|
6
LifStge 2022-03-21 07:15:17 +08:00 1
webrtc 不太现实 这个要同时使用相同资源多的...
m3u8 没啥问题啊 自己通过域名做下负载 然后再把 m3u8 做成动态接口 自己服务器间用算法再做一下动态的负载 就是一个 m3u8 N 个切片 做个规则 把切片动态的分布在不同的子域名下(服务器间闲忙状态维护下) 均匀的分布下 也就可以了吧... ...多说一句 现在那种小站 不都是 套了一层 cf 本站就维护了 html... 什么图片 切片 统统都是薅的羊毛 分布在各个不同的免费站 或 上传漏洞上.... |
7
cpstar 2022-03-21 08:54:27 +08:00 1
OP 2# 你把 M3U8 动态生成不就得了。每次随机出不同的列表,所有服务器保存所有切片,或者排列出所有可能,然后依次提供给不同的用户,n 台服务器、m 个切片,n*m 个 m3u8 随机提供给用户。
|
8
okakuyang 2022-03-21 09:29:41 +08:00
webrtc 是用来实时通信的,传输速率没有直接 http 那么高。
|
9
ch2 OP @cpstar 现在发现瓶颈出在播放器用的 hls.js 上,这个库下载 m3u8 的 ts 切片是按顺序来的,不能并行下载,即使做了切片的负载均衡,任意时刻也只会下载其中一个
|
10
cpstar 2022-03-21 11:04:20 +08:00
OP 9# 不不不,我的意思是“伪”动态生成 m3u8 ,比如 n=3 ,m=3 ,先伪动态生成 9 个 m3u8 ,然后用户请求的时候从 9 个里边返回一个给用户。而每个 m3u8 的内容,都含有域名区分的,比如
list_1.m3u8 是 http://a.example.com/1.ts http://b.example.com/2.ts http://c.example.com/3.ts 而 list_2.m3u8 是 http://b.example.com/1.ts http://c.example.com/2.ts http://a.example.com/3.ts 以此类推 |
11
ch2 OP @cpstar 现在又出现一个新问题,由于播放器播放视频的时候默认会缓冲 3 个 ts ,但是这三个 ts 是串行缓存的。这就导致了把这三个 ts 存在三个不同的服务器上跟在一台上实际上效果是等同的(只针对一个人看视频而言)。我去查了 hls.js 的 issue ,发现他们并没有打算做并行缓存这个特性
|
12
cpstar 2022-03-21 11:24:31 +08:00
这你就没办法控制了,本身 M3U8 就是个顺序执行机制,m3u 就是个顺序播放列表么,你永远无法知道用户什么时候播放下一个视频(因为可以播放可以暂停,除非你不提供暂停机制)。
除非你上负载均衡做运行时均衡,nginx upstream 各类机制,或者 SRS 边缘节点之类的。 相比较,这就是成本问题,你不能既要熊掌又要鱼。 |