Skip to content

实例化与参数配置

var engine = new P2PEngineVHS(player, {p2pConfig: [opts]});

创建一个新的 P2PEngineVHS 实例,其中 playervideo.js 的实例。

如果指定了 opts ,那么对应的默认值将会被覆盖。

字段类型默认值描述
logLevelstring|boolean'error'log的等级,分为warn、error、none,设为true等于warn,设为false等于none。
tokenstringundefinedtoken用于控制台多域名数据汇总展示,另外如果自定义channelId也需要设置token。
trackerZonestring'eu'tracker服务器地址的国家代号,分为'eu'、'hk'、'us'。
memoryCacheLimitObject{"pc": 400 * 1024 * 1024, "mobile": 100 * 1024 * 1024}p2p缓存的最大数据量,分为PC和mobile。
useDiskCachebooleantrue点播模式用 IndexedDB 存储数据。
diskCacheLimitObject{"pc": 2500 * 1024 * 1024, "mobile": 1500 * 1024 * 1024}磁盘缓存的最大数据量,分为PC和mobile。
p2pEnabledbooleantrue是否开启P2P。
webRTCConfigObject{}用于配置stun和datachannel的字典
useHttpRangebooleantrue在可能的情况下使用Http Range请求来补足p2p下载超时的剩余部分数据。
httpLoadTimenumber3.0P2P下载超时后留给HTTP下载的时间。
sharePlaylistbooleanfalse是否允许m3u8文件的P2P传输。
strictSegmentIdbooleanfalse使用基于url的SegmentId,替代默认基于序列号的。

P2PEngineVHS API

P2PEngineVHS.version (static)

获取 P2PEngineVHS 的版本号。

P2PEngineVHS.protocolVersion (static)

获取 P2P 协议的版本号。

P2PEngineVHS.isSupported() (static method)

判断当前浏览器是否支持WebRTC datachannel。

engine.enableP2P()

在p2p暂停或未启动情况下启动p2p。

engine.disableP2P()

停止p2p并释放内存。

engine.destroy()

停止p2p、销毁engine并释放内存。

P2PEngineVHS 事件

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)
e.message: 异常信息
e.stack: 异常堆栈信息

通过p2pConfig获取p2p信息

javascript
p2pConfig: {
    getStats: function (totalP2PDownloaded, totalP2PUploaded, totalHTTPDownloaded, p2pDownloadSpeed) {
        // 获取p2p下载信息
    },
    getPeerId: function (peerId) {
        // 获取本节点的Id
    },
    getPeersInfo: function (peers) {
        // 获取成功连接的节点的信息
    }
}
p2pConfig: {
    getStats: function (totalP2PDownloaded, totalP2PUploaded, totalHTTPDownloaded, p2pDownloadSpeed) {
        // 获取p2p下载信息
    },
    getPeerId: function (peerId) {
        // 获取本节点的Id
    },
    getPeersInfo: function (peers) {
        // 获取成功连接的节点的信息
    }
}

高级用法

解决动态 m3u8/mpd 路径问题

某些流媒体提供商的 m3u8/mpd 是动态生成的,不同节点的mpd地址不一样,例如example.com/clientId1/streamId.mpd和example.com/clientId2/streamId.mpd, 而本插件默认使用m3u8/mpd作为channelId。这时候就要构造一个共同的chanelId,使实际观看同一直播/视频的节点处在相同频道中。

javascript
// 必须先在 p2pConfig 设置 token ,才能自定义 channelId !
p2pConfig: {
    token: YOUR_TOKEN,
    channelId: function (mpdUrl) {
        const videoId = extractVideoIdFromUrl(mpdUrl);   // 忽略差异部分,构造一个一致的channelId,其中 extractVideoIdFromUrl 需要自己定义,可以抽取url中的视频ID作为结果返回
        return videoId;
    }
    // channelId: VIDEO_ID       // for fixed channel id
}
// 必须先在 p2pConfig 设置 token ,才能自定义 channelId !
p2pConfig: {
    token: YOUR_TOKEN,
    channelId: function (mpdUrl) {
        const videoId = extractVideoIdFromUrl(mpdUrl);   // 忽略差异部分,构造一个一致的channelId,其中 extractVideoIdFromUrl 需要自己定义,可以抽取url中的视频ID作为结果返回
        return videoId;
    }
    // channelId: VIDEO_ID       // for fixed channel id
}

解决动态切片路径问题

类似动态mpd路径问题,相同切片文件的路径也可能有差异,这时候需要忽略切片路径差异的部分。插件默认用切片的绝地路径(url)来标识每个切片文件,所以需要通过钩子函数重新构造标识符。可以按如下设置:

javascript
p2pConfig: {
    /*
        segmentUrl: The url of segment
        range: The byte range of segment
     */
    segmentId: function (segmentUrl, range) {
        const segId = extractSegmentIdFromUrl(segmentUrl, range);
        return segId;
    }
}
p2pConfig: {
    /*
        segmentUrl: The url of segment
        range: The byte range of segment
     */
    segmentId: function (segmentUrl, range) {
        const segId = extractSegmentIdFromUrl(segmentUrl, range);
        return segId;
    }
}
javascript
p2pConfig: {
    /*
        streamId: The id of stream
        sn: The serial number of segment
        segmentUrl: The url of segment
        range: The byte range of segment
     */
    segmentId: function (streamId, sn, segmentUrl, range) {
        const tsId = extractSegmentIdFromUrl(segmentUrl);
        return tsId;
    }
}
p2pConfig: {
    /*
        streamId: The id of stream
        sn: The serial number of segment
        segmentUrl: The url of segment
        range: The byte range of segment
     */
    segmentId: function (streamId, sn, segmentUrl, range) {
        const tsId = extractSegmentIdFromUrl(segmentUrl);
        return tsId;
    }
}

粤ICP备18075581号