API文档
# 实例化与参数配置
# var engine = new P2PEngineMp4(video, mediaConfig);
创建一个新的 P2PEngineMp4 实例,其中 video 是 html5 video 标签。
如果指定了 mediaConfig ,那么对应的默认值将会被覆盖。
字段 | 类型 | 默认值 | 描述 |
---|---|---|---|
autoplay | boolean | false | 是否自动播放。 |
controls | boolean | false | 是否显示进度条。 |
muted | boolean | false | 是否静音播放。 |
maxBufferLength | number | 60 | 最大缓冲时长,单位:秒。 |
minBufferLength | number | 40 | 最小缓冲时长,单位:秒。 |
p2pConfig | Object | - | P2P配置,具体见下文。 |
如果指定了 mediaConfig.p2pConfig ,那么对应的默认值将会被覆盖。
字段 | 类型 | 默认值 | 描述 |
---|---|---|---|
logLevel | string|boolean | 'error' | log的等级,分为warn、error、none,设为true等于warn,设为false等于none。 |
wsSignalerAddr | string | 'wss://signal.cdnbye.com' | 信令服务器地址。 |
announce | string | 'https://tracker.cdnbye.com/v1' | tracker服务器地址。 |
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的字典。 |
channelIdPrefix | string | '' | 如果使用自定义的channelId,则此字段必须设置,且长度必须大于4个字符并且小于16个字符,建议设置成你所在组织的唯一标识。 |
pieceLength | number | 512 * 1024 | 每个切片的大小(单位:Byte),相同pieceLength的节点才能互相连接,建议根据码率进行调整。 |
httpMaxRetrys | number | 3 | HTTP下载某个切片的最大重试次数。 |
waitForPeer | boolean | false | 优先尝试从对等端下载前几片数据,可以提高P2P比例,但可能会增加起播延时。 |
waitForPeerTimeout | number | 4.5 | waitForPeer的超时时间,超时后恢复从http下载。 |
httpLoadTime | number | 2.0 | P2P下载超时后留给HTTP下载的时间。 |
# P2PEngineMp4 API
# P2PEngineMp4.version (static)
获取 P2PEngineMp4 的版本号。
# P2PEngineMp4.protocolVersion (static)
获取 P2P 协议的版本号。
# P2PEngineMp4.isSupported() (static method)
判断当前浏览器是否同时支持WebRTC datachannel和MSE(Media Source Extension)。
# engine.loadSource(url)
加载MP4文件的url。
# engine.enableP2P()
在p2p暂停或未启动情况下启动p2p。
# engine.disableP2P()
停止p2p并释放内存。
# engine.destroy()
停止p2p、销毁engine并释放内存。
# P2PEngineMp4 事件
# 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)
stats.p2pDownloadSpeed: P2P下载速度(单位KB/s)
# engine.on('serverConnected', function (connected) {})
当连接/断开websocket时回调该事件。
# engine.on('exception', function (e) {})
该回调函数可以获取SDK的异常信息,包括:
e.code: 异常标识(TRACKER_EXPT SIGNAL_EXPT MEDIA_EXPT)
e.message: 异常信息
e.stack: 异常堆栈信息
# 通过p2pConfig获取p2p信息
p2pConfig: {
getStats: function (totalP2PDownloaded, totalP2PUploaded, totalHTTPDownloaded, p2pDownloadSpeed) {
// 获取p2p下载信息
},
getPeerId: function (peerId) {
// 获取本节点的Id
},
getPeersInfo: function (peers) {
// 获取成功连接的节点的信息
}
}
# 高级用法
# 切换源
先调用 destroy 方法释放资源,然后重新创建 P2PEngineMp4 实例。
engine.destroy();
engine = new P2PEngineMp4(video);
engine.loadSource('another.mp4');
# 解决动态 MP4 路径问题
某些流媒体提供商的 MP4 地址是动态生成的,不同节点的 MP4 地址不一样,例如example.com/clientId1/streamId.mp4和example.com/clientId2/streamId.mp4, 而本插件默认使用 *.mp4 作为channelId。这时候就要构造一个共同的chanelId,使实际观看同一视频的节点处在相同频道中。
// 必须先在 p2pConfig 设置 channelIdPrefix ,才能自定义 channelId !
p2pConfig: {
channelIdPrefix: YOUR_UNIQUE_ID,
channelId: function (mp4Url) {
const videoId = extractVideoIdFromUrl(mp4Url); // 忽略差异部分,构造一个一致的channelId,其中 extractVideoIdFromUrl 需要自己定义,可以抽取url中的视频ID作为结果返回
return videoId;
}
}
# P2P优先策略
由于建立P2P连接需要时间,默认情况下前几片用HTTP下载。可以通过配置参数,等待P2P建立连接后优先用P2P下载,从而提升P2P效果,但可能会带来延时,建议在热度比较大的频道开启。
p2pConfig: {
waitForPeer: true,
waitForPeerTimeout: 4.5, // 可以根据具体场景设置超时时间
}