同步操作将从 无语西风/hlsjs-p2p-engine 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
CDNBye通过WebRTC datachannel技术和BT算法,在观看同一视频/直播的用户之间构建P2P网络,在节省带宽成本的同时,提升用户的播放体验。
采用本插件的前提是浏览器支持WebRTC (Chrome, Firefox, Opera, Safari)。
<script src="https://cdn.jsdelivr.net/npm/cdnbye@latest"></script>
<video id="video" controls></video>
<script>
if(Hls.isSupported()) {
var video = document.getElementById('video');
var hls = new Hls({
p2pConfig: {
logLevel: false,
}
});
hls.loadSource('https://video-dev.github.io/streams/x36xhzz/url_2/193039199_mp4_h264_aac_ld_7.m3u8');
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED,function(event, data) {
video.play();
});
hls.p2pEngine.on('stats', function (stats) {
console.log(`totalP2PDownloaded ${stats.totalP2PDownloaded}KB`);
});
}
</script>
Hls.engineVersion
(static method)当前插件的版本号
Hls.WEBRTC_SUPPORT
(static method)判断当前浏览器是否支持WebRTC
if (Hls.WEBRTC_SUPPORT) {
// WebRTC is supported
} else {
// Use a fallback
}
var hls = new Hls({p2pConfig: [opts]});
创建一个新的Hls
实例。
var engine = hls.p2pEngine;
从Hls
实例中获取P2PEngine
实例。
如果指定了opts
,那么对应的默认值将会被覆盖。
字段 | 类型 | 默认值 | 描述 |
---|---|---|---|
logLevel |
string or boolean | 'none' | log的等级,分为debug、info、warn、error、none,设为true等于debug,设为false等于none。 |
announce |
string | 'https://api.cdnbye.com/v1' | tracker服务器地址。 |
wsSignalerAddr |
string | 'wss://signal.cdnbye.com/wss' | 信令服务器地址。 |
wsMaxRetries |
number | 3 | websocket连接重试次数。 |
wsReconnectInterval |
number | 5 | websocket重连时间间隔。 |
loadTimeoutRate |
number | 0.7 | p2p下载的超时时间比率,用于计算超时时间。 |
maxBufferSize |
Object | {"pc": 1024 * 1024 * 100, "mobile": 1024 * 1024 * 50} | p2p缓存的最大数据量,mobile字段暂未实现。 |
p2pEnabled |
boolean | true | 是否开启P2P。 |
channelId |
function | - | 标识channel的字段,同一个channel的用户可以共享数据。(参考高级用法) |
segmentId |
function | - | 标识ts文件的字段,防止相同ts文件具有不同的路径。(参考高级用法) |
packetSize |
number | 64 * 1024 | 每次通过datachannel发送的包的大小,64KB适用于较新版本的浏览器,如果要兼容低版本浏览器可以设置成16KB。 |
webRTCConfig |
Object | {} | 用于配置stun和datachannel的字典。 |
var engine = new P2PEngine(hlsjs, p2pConfig);
实例化P2PEngine
。也可以从Hls
实例获取P2PEngine
实例:
var hls = new Hls();
var engine = hls.p2pEngine;
engine.version
获取P2PEngine
的版本号。
engine.isSupported()
判断当前浏览器是否支持WebRTC data channel。
engine.enableP2P()
在p2p暂停或未启动情况下启动p2p。
engine.disableP2P()
停止p2p并释放内存。
engine.destroy()
停止p2p、销毁engine并释放内存。在Hls.js销毁时会自动调用。
engine.on('peerId', function (peerId) {})
当从服务端获取到peerId时回调该事件。
engine.on('peers', function (peers) {})
当与新的节点成功建立p2p连接时回调该事件。
engine.on('stats', function (stats) {})
该回调函数可以获取p2p信息,包括: stats.totalHTTPDownloaded: 从HTTP(CDN)下载的数据量(单位KB) stats.totalP2PDownloaded: 从P2P下载的数据量(单位KB) stats.totalP2PUploaded: P2P上传的数据量(单位KB)
某些流媒体提供商的m3u8是动态生成的,不同节点的m3u8地址不一样,例如example.com/clientId1/file.m3u8和example.com/clientId2/file.m3u8, 而本插件默认使用m3u8作为channelId。这时候就要构造一个共同的chanelId,使实际观看同一直播/视频的节点处在相同频道中。
p2pConfig: {
channelId: function (m3u8Url) {
const formatedUrl = format(m3u8Url); // 忽略差异部分,构造一个一致的channelId
return formatedUrl;
}
}
类似动态m3u8路径问题,相同ts文件的路径也可能有差异,这时候需要忽略ts路径差异的部分。
p2pConfig: {
segmentId: function (level, sn, tsUrl) {
const formatedUrl = format(tsUrl); // 忽略路径差异的部分,使相同的ts文件具有相同的segmentId
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' }
]
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。