Skip to content

實例化 P2PEngineMedia

var engine = new P2PEngineMedia(p2pConfig);

建立一個 P2PEngineMedia 實例。

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

欄位型別預設值描述
logLevelstring|boolean'error'log的等級,分為warn、error、none,設為true等於warn,設為false等於none。
tokenstringundefinedtoken用於控制台多網域資料彙總展示,另外如果自訂channelId也需要設定token。
trackerZonestring'eu'tracker伺服器位址的國家代號,分為'cn'、'eu'、'hk'、'us'。
diskCacheLimitObject{"pc": 400 * 1024 * 1024, "mobile": 100 * 1024 * 1024}p2p快取的最大資料量,分為PC和mobile。
pieceLengthnumber512 * 1024每個切片的大小(單位:Byte),相同pieceLength的節點才能互相連線,建議根據位元率進行調整。
mediaElemHTMLMediaElement|stringundefined指定video或audio標籤的id或Element物件,預設是document中的第一個video/audio元素。
p2pEnabledbooleantrue是否開啟P2P。
webRTCConfigObject{}用於設定stun和datachannel的字典
tagstring''使用者自訂標籤。
swFilestring'./sw.js'ServiceWorker檔名和路徑.
swScopestring'./'ServiceWorker預設作用域是目前目錄以及所有子目錄,因此如果將 sw.js 放在網站根目錄,那麼所有網站請求都在 ServiceWorker 控制範圍內。
diskCacheLimitObject{"pc": 1500 * 1024 * 1024, "mobile": 1000 * 1024 * 1024}磁碟快取的最大資料量,分為PC和mobile。
minBufferCountnumber0video元素剩餘緩衝piece數量小於這個數值將強制用HTTP下載。
startFromSegmentOffsetnumber3開始請求tracker服務的segment偏移量。

P2PEngineMedia API

P2PEngineMedia.version (static)

取得 P2PEngineMedia 的版本號。

P2PEngineMedia.protocolVersion (static)

取得 P2P 協定的版本號。

P2PEngineMedia.isSupported() (static)

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

P2PEngineMedia.isWebRTCSupported() (static)

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

P2PEngineMedia.isSeviceWorkerSupported() (static)

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

engine.getProxiedUrl(originalURL)

取得本地代理位址,參數是原始位址字串,回傳值是本地代理位址的Promise。

engine.enableP2P()

啟動 p2p 。

engine.disableP2P()

停止 p2p 並釋放資源。

engine.restartP2p()

重新啟動 p2p 。

P2PEngineMedia 事件

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) {
        // 取得成功連線的節點的資訊
    },
    onHttpDownloaded: function (traffic) {
        // 監聽http下載流量
    },
    onP2pDownloaded: function (traffic, speed) {
        // 監聽p2p下載流量和速度
    },
    onP2pUploaded: function (traffic) {
        // 監聽p2p上傳流量
    },
}

WARNING

下載和上傳資料量的單位是KB,下載速度的單位是KB/s。

MediaProxy.version (static)

取得 MediaProxy 的版本號。

進階用法

解決動態 MP4/MP3 路徑問題

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

javascript
// 必須先在 p2pConfig 設定 token,才能自訂 channelId ! 與其他平台互通需要建構相同的 token 。
p2pConfig: {
    token: YOUR_TOKEN,
    channelId: function (url) {
        const videoId = extractVideoIdFromUrl(url);   // 忽略差異部分,建構一個一致的channelId,其中 extractVideoIdFromUrl 需要自己定義,可以擷取url中的影片ID作為結果回傳
        return videoId;
    }
    // channelId: VIDEO_ID       // for fixed channel id
}

WARNING

如果要與其他平台互通,則必須確保兩者擁有相同的 token 和 channelId 。

粤ICP备18075581号