實例化與參數設定
var engine = new P2PEngineVHS(player, {p2pConfig: [opts]}, videojs = window.videojs);
建立一個新的 P2PEngineVHS 實例,其中 player 是 video.js 的實例。
如果指定了 opts,那麼對應的預設值將會被覆蓋。
| 欄位 | 型別 | 預設值 | 描述 |
|---|---|---|---|
| logLevel | string|boolean | 'error' | log的等級,分為warn、error、none,設為true等於warn,設為false等於none。 |
| token | string | undefined | token用於控制台多網域資料彙總展示,另外如果自訂channelId也需要設定token。 |
| trackerZone | string | 'eu' | tracker伺服器位址的國家代號,分為'cn'、'eu'、'hk'、'us'。 |
| memoryCacheLimit | Object | {"pc": 400 * 1024 * 1024, "mobile": 100 * 1024 * 1024} | p2p快取的最大資料量,分為PC和mobile。 |
| useDiskCache | boolean | true | 隨選模式用 IndexedDB 儲存資料。 |
| diskCacheLimit | Object | {"pc": 1500 * 1024 * 1024, "mobile": 1000 * 1024 * 1024} | 磁碟快取的最大資料量,分為PC和mobile。 |
| p2pEnabled | boolean | true | 是否開啟P2P。 |
| webRTCConfig | Object | undefined | 用於設定stun和datachannel的字典。 |
| useHttpRange | boolean | true | 在可能的情況下使用Http Range請求來補足p2p下載逾時的剩餘部分資料。 |
| sharePlaylist | boolean | false | 是否允許m3u8檔案的P2P傳輸。 |
| strictSegmentId | boolean | false | 使用基於url的SegmentId,替代預設基於序號的。 |
| prefetchOnly | boolean | false | HLS模式下只採用預先載入的方式進行P2P下載。 |
| startFromSegmentOffset | number | 3 | 開始請求tracker服務的segment偏移量。 |
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資訊
p2pConfig: {
getStats: function (totalP2PDownloaded, totalP2PUploaded, totalHTTPDownloaded, p2pDownloadSpeed) {
// 取得p2p下載資訊
},
getPeerId: function (peerId) {
// 取得本節點的Id
},
getPeersInfo: function (peers) {
// 取得成功連線的節點的資訊
},
onHttpDownloaded: function (traffic) {
// 監聽http下載流量
},
onP2pDownloaded: function (traffic, speed) {
// 監聽p2p下載流量和速度
},
onP2pUploaded: function (traffic) {
// 監聽p2p上傳流量
},
}WARNING
下載和上傳資料量的單位是KB,下載速度的單位是KB/s。
進階用法
解決動態 m3u8/mpd 路徑問題
某些串流媒體提供商的 m3u8/mpd 是動態產生的,不同節點的mpd位址不一樣,例如example.com/clientId1/streamId.mpd和example.com/clientId2/streamId.mpd, 而本外掛程式預設使用m3u8/mpd作為channelId。這時候就要建構一個共同的channelId,使實際觀看同一直播/影片的節點處在相同頻道中。
// 必須先在 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)來標識每個切片檔案,所以需要透過鉤子函式重新建構識別碼。可以按如下設定:
p2pConfig: {
/*
segmentUrl: The url of segment
range: The byte range of segment
*/
segmentId: function (segmentUrl, range) {
const segId = extractSegmentIdFromUrl(segmentUrl, range);
return segId;
}
}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;
}
}