Skip to content

實例化與參數設定

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

建立一個新的 P2PEngineDash 實例,其中 playerdashjs 的MediaPlayer實例。

如果指定了 opts,那麼對應的預設值將會被覆蓋。

欄位型別預設值描述
logLevelstring|boolean'error'log的等級,分為warn、error、none,設為true等於warn,設為false等於none。
tokenstringundefinedtoken用於控制台多網域資料彙總展示,另外如果自訂channelId也需要設定token。
trackerZonestring'eu'tracker伺服器位址的國家代號,分為'cn'、'eu'、'hk'、'us'。
memoryCacheLimitObject{"pc": 400 * 1024 * 1024, "mobile": 100 * 1024 * 1024}p2p快取的最大資料量,分為PC和mobile。
p2pEnabledbooleantrue是否開啟P2P。
webRTCConfigObject{}用於設定stun和datachannel的字典
useHttpRangebooleantrue在可能的情況下使用Http Range請求來補足p2p下載逾時的剩餘部分資料。
useDiskCachebooleantrue隨選模式用 IndexedDB 儲存資料。
diskCacheLimitObject{"pc": 1500 * 1024 * 1024, "mobile": 1000 * 1024 * 1024}磁碟快取的最大資料量,分為PC和mobile。
prefetchOnlybooleanfalseHLS模式下只採用預先載入的方式進行P2P下載。
startFromSegmentOffsetnumber3開始請求tracker服務的segment偏移量。

P2PEngineDash API

P2PEngineDash.version (static)

取得 P2PEngineDash 的版本號。

P2PEngineDash.protocolVersion (static)

取得 P2P 協定的版本號。

P2PEngineDash.isSupported() (static method)

判斷目前瀏覽器是否支援WebRTC datachannel。

engine.enableP2P()

在p2p暫停或未啟動情況下啟動p2p。

engine.disableP2P()

停止p2p並釋放記憶體。

engine.destroy()

停止p2p、銷毀engine並釋放記憶體。

P2PEngineDash事件

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 DASHJS_EXPT)
e.message: 異常資訊
e.stack: 異常堆疊資訊

透過p2pConfig取得p2p資訊

javascript
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。

進階用法

解決動態 MPD 路徑問題

某些串流媒體提供商的 MPD 是動態產生的,不同節點的mpd位址不一樣,例如example.com/clientId1/streamId.mpd和example.com/clientId2/streamId.mpd, 而本外掛程式預設使用mpd作為channelId。這時候就要建構一個共同的channelId,使實際觀看同一直播/影片的節點處在相同頻道中。

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
}

解決動態切片路徑問題

類似動態mpd路徑問題,相同切片檔案的路徑也可能有差異,這時候需要忽略切片路徑差異的部分。外掛程式預設用切片的絕對路徑(url)來標識每個切片檔案,所以需要透過鉤子函式重新建構識別碼。可以按如下設定:

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

允許Http Range請求

當對等端上行頻寬不夠時,可能導致p2p傳輸逾時而轉向http下載,原本p2p下載的資料無法複用。Http Range請求用於補足p2p下載逾時的剩餘部分資料,要開啟Http Range,首先需要來源伺服器支援,然後增加以下設定:

javascript
p2pConfig: {
    useHttpRange: true,
}

自行設定 STUN 和 TURN 伺服器位址

STUN用於p2p連線過程中取得公用網路IP位址,TURN則可以在p2p連線不通時用於中繼資料。本SDK已內建公開的STUN服務,開發者可以透過P2pConfig來更換STUN位址。TURN伺服器則需要開發者自行架設,可以參考coturn

javascript
p2pConfig: {
    webRTCConfig: {
       iceServers: [
           { urls: YOUR_STUN_OR_TURN_SERVER }
       ]
    }
}

切片合法性校驗

有時候我們需要校驗從節點下載的切片的合法性(類似bittorrent的雜湊校驗)。 CDNBye提供了一個鉤子函式,可以回呼下載的切片供開發者進行校驗。用於校驗的 雜湊表建議直接從伺服器下載,開發者可以透過程式計算每個ts檔案的雜湊並儲存於 特定的檔案中或直接嵌入到m3u8檔案中。如果校驗失敗,直接在回呼函式中 回傳false即可。

javascript
p2pConfig: {
   validateSegment: function (segId, buffer) {
       var hash = hashFile.getHash(segId);
       return hash === md5(buffer);
   }
}

粤ICP备18075581号