TIP
基于ServiceWorker的流媒体加速引擎,支持mp4, webm, mkv, ogv, mov, wav, mp3等,适配所有浏览器(包括iOS Safari)和Web播放器!
本项目基于ServiceWorkers和WebRTC在所有现代浏览器和Web播放器实现了MP4/MP3的P2P能力。
演示Demo
打开2个相同的网页:demo
浏览器支持情况
由于WebRTC已成为HTML5标准,目前大部分主流浏览器都已经支持。兼容性取决于浏览器是否支持 WebRTC 和 ServiceWorker。
兼容性 | Chrome | Firefox | macOS Safari | Opera | Edge | iOS Safari | IE |
---|---|---|---|---|---|---|---|
WebRTC Datachannel | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ |
Service Worker | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ |
Supported | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ |
工作原理
- 首先由客户端嵌入的SDK 注册 ServiceWorker ,从而在播放器与网络之间嵌入一层本地代理
- 播放器向本地代理请求视频流
- 本地代理(ServiceWorker)通过监听 fetch 事件,拦截全站的网络请求,并识别出 MP4/MP3 文件请求,构造并响应ReadableStream。
javascript
self.addEventListener('fetch', event => { /* ⛦ magic here ⛦ */ })
- 监听ReadableStream的pull请求,将请求的文件范围划分成若干个子范围请求,随后将这些子范围请求依次转发到主线程
- 主线程根据P2P网络情况决定是否从对等端下载,下载完成后在主线程保留一份拷贝以分享给其他节点
- 当资源被一个设备缓存之后,其他设备在请求相同资源时,将尝试优先通过P2P网络就近从该设备获取资源,而不是从成本更高、距离更远的源服务器获取(即用WebRTC替代HTTP)
- 从P2P网络获取失败或者不能缓存的资源,将自动回源
局限性
- 由于ServiceWorker的限制,需要用https访问网站
- 由于ServiceWorker的限制,需要将sw.js文件部署至托管域名的服务器