CDNBye通过WebRTC datachannel技术和BT算法,在观看同一视频/直播的用户之间构建P2P网络,在节省带宽成本的同时,提升用户的播放体验。
采用本插件的前提是浏览器支持WebRTC (Chrome, Firefox, Opera, Safari)。
当前插件的版本号
判断当前浏览器是否支持WebRTC
if (Hls.WEBRTC_SUPPORT) {
// WebRTC is supported
} else {
// Use a fallback
}
创建一个新的Hls
实例。
从Hls
实例中获取P2PEngine
实例。
如果指定了opts
,那么对应的默认值将会被覆盖。
字段 | 类型 | 默认值 | 描述 |
---|---|---|---|
logLevel |
string or boolean | 'none' | log的等级,分为warn、error、none,设为true等于warn,设为false等于none。 |
live |
boolean | false | 直播或者点播模式,建议在点播模式下设为false,p2p插件会预缓存buffer以避免卡顿。 |
wsSignalerAddr |
string | 'wss://signal.cdnbye.com' | 信令服务器地址。 |
announce |
string | 'https://tracker.cdnbye.com/v1' | tracker服务器地址。 |
wsMaxRetries |
number | 15 | websocket连接重试次数。 |
wsReconnectInterval |
number | 30 | websocket重连时间间隔。 |
memoryCacheLimit |
Object | {"pc": 1024 * 1024 * 512, "mobile": 1024 * 1024 * 256} | p2p缓存的最大数据量,分为PC和mobile。 |
p2pEnabled |
boolean | true | 是否开启P2P。 |
wifiOnly |
boolean | false | 是否只在wifi和有线网络模式上传数据(建议在云端设置)。 |
dcDownloadTimeout |
number | 25 | p2p下载的最大超时时间。 |
webRTCConfig |
Object | {} | 用于配置stun和datachannel的字典。 |
useHttpRange |
boolean | false | 在可能的情况下使用Http Range请求来补足p2p下载超时的剩余部分数据(直播模式下默认是true)。 |
getStats |
function | - | 获取p2p统计信息,包括totalP2PDownloaded、totalP2PUploaded和totalHTTPDownloaded。 |
getPeerId |
function | - | 获取本节点的Id,当从服务端获取到peerId时回调该事件。 |
getPeersInfo |
function | - | 获取成功连接的节点的信息,当与新的节点成功建立p2p连接时回调该事件。 |
channelId |
function | - | 标识channel的字段,同一个channel的用户可以共享数据。(参考高级用法) |
validateSegment |
function | - | 用于校验从其它节点下载的ts文件的合法性。 |
获取P2PEngine
的版本号。
判断当前浏览器是否支持WebRTC data channel。
实例化P2PEngine
。也可以从Hls
实例获取P2PEngine
实例:
var hls = new Hls();
var engine = hls.p2pEngine;
在p2p暂停或未启动情况下启动p2p。
停止p2p并释放内存。
停止p2p、销毁engine并释放内存。在Hls.js销毁时会自动调用。
当从服务端获取到peerId时回调该事件。
当与新的节点成功建立p2p连接时回调该事件。
该回调函数可以获取p2p信息,包括:
stats.totalHTTPDownloaded: 从HTTP(CDN)下载的数据量(单位KB)
stats.totalP2PDownloaded: 从P2P下载的数据量(单位KB)
stats.totalP2PUploaded: P2P上传的数据量(单位KB)
p2pConfig: {
getStats: function (totalP2PDownloaded, totalP2PUploaded, totalHTTPDownloaded) {
// do something
}
}
p2pConfig: {
getPeerId: function (peerId) {
// do something
}
}
p2pConfig: {
getPeersInfo: function (peers) {
// do something
}
}
某些流媒体提供商的m3u8是动态生成的,不同节点的m3u8地址不一样,例如example.com/clientId1/file.m3u8和example.com/clientId2/file.m3u8,
而本插件默认使用m3u8作为channelId。这时候就要构造一个共同的chanelId,使实际观看同一直播/视频的节点处在相同频道中。强烈建议在chanelId中加入唯一标识符,防止与其他频道产生冲突。
p2pConfig: {
channelId: function (m3u8Url) {
const formatedUrl = 'YOUR_UNIQUE_ID' + format(m3u8Url); // 忽略差异部分,构造一个一致的channelId
return formatedUrl;
}
}
p2pConfig: {
webRTCConfig: {
config: { // custom webrtc configuration (used by RTCPeerConnection constructor)
iceServers: [
{ urls: 'stun:stun.l.google.com:19302' },
{ urls: 'stun:global.stun.twilio.com:3478?transport=udp' }
]
}
}
}
当对等端上行带宽不够时,可能导致p2p传输超时而转向http下载,原本p2p下载的数据无法复用。Http Range请求用于补足p2p下载超时的剩余部分数据,要开启Http Range,首先需要源服务器支持,请参考允许Http Range请求,然后增加以下配置:
p2pConfig: {
useHttpRange: true,
}
有时候我们需要校验从节点下载的切片的合法性(类似bittorrent的哈希校验)。 CDNBye提供了一个钩子函数,可以回调下载的切片供开发者进行校验。用于校验的 哈希表建议直接从服务器下载,开发者可以通过程序计算每个ts文件的哈希并存储于 特定的文件中或者直接嵌入到m3u8文件中。如果校验失败,直接在回调函数中 返回false即可。
p2pConfig: {
validateSegment: function (level, sn, buffer) {
var hash = hashFile.getHash(level, sn);
return hash === md5(buffer);
}
}
CDNBye提供了两个查询参数用于在线调试:
- 如果要在调试的网页打印log,只需要在url中加入查询参数
_debug=1
,例如http://your_website.com?_debug=1
,即可在console中显示日志信息。 - 在已经开启P2P的情况下,要使调试的网页临时关闭P2P,只需要在url中加入查询参数
_p2p=0
即可,例如http://your_website.com?_p2p=0
。