P2P設定
P2pEngine
實例化P2pEngine,取得一個全域單例:
javascript
//初始化
function initP2p (token:string,configOptions:ConfigOptions|null=null):void參數說明:
| 參數 | 型別 | 是否必要 | 說明 |
|---|---|---|---|
| token | string | 是 | CDNBye分配的token。 |
| config | ConfigOptions | 否 | 自訂設定。 |
取得P2P位址或切換來源
當播放或切換到新的播放位址時,只需要將新的播放位址傳給外掛程式,從而取得新的本地播放位址:
javascript
function getP2pUrl(url : string, videoId:string|null=null, mimeType:string|null=null) : string參數說明:
| 參數 | 型別 | 是否必要 | 說明 |
|---|---|---|---|
| url | string | 是 | 未經過轉換的原始播放位址 |
| videoId | string | 否 | 傳入此參數將使用videoId建構channelId,其他端需要保持一致 |
| mimeType | string | 否 | 傳用於無「.m3u8」或「.mpd」副檔名的url,傳入字串「m3u8」或「mpd」 |
P2pEngine API
javascript
//目前外掛程式的版本號。
function getP2pEngineVersion():string
//是否已與CDNBye後台建立連線。
function p2pIsConnected():boolean
//立即停止P2P加速並釋放資源,一般只需要在退出APP的時候呼叫即可。SDK採用「延遲釋放」的策略,只有在重新啟動p2p的時候才釋放資源。對於效能較差的裝置起播耗時可能比較明顯,建議在影片播放之前提前呼叫 engine.stopP2p() 。
function stopP2p():void
//重新啟動P2P加速服務,一般不需要呼叫。
function restartP2p():boolean
//取得對等連線的id。
function peerId():string
//動態設定請求ts和m3u8時的HTTP請求標頭。
function setHttpHeadersForHls(headers: Map<String, String>):void
//動態設定請求Dash檔案時的HTTP請求標頭。僅Android
function setHttpHeadersForDash(headers: Map<String, String>):void
//執行時動態關閉P2P,在播放下一個媒體檔案時才生效。
function disableP2p():void
//執行時動態開啟P2P,在播放下一個媒體檔案時才生效。
function enableP2p():void
//停止P2P並關閉代理伺服器。
function shutdownP2p():voidP2P 統計
typescript
import { onP2pStats, StatsObject } from "@/uni_modules/cdnbye-swarmcloud";
onReady() {
onP2pStats((stats: StatsObject) => {
console.log(stats.serverConnected)
console.log(stats.httpDownloaded)
console.log(stats.p2pDownloaded)
console.log(stats.p2pUploaded)
console.log(stats.peers)
})
}WARNING
下載和上傳資料量的單位是 KB。
解決動態 m3u8 路徑問題
某些串流媒體提供商的 m3u8 是動態產生的,不同節點的 m3u8 位址不一樣,例如 example.com/clientId1/streamId.m3u8 和 example.com/clientId2/streamId.m3u8, 而本外掛程式預設使用 m3u8 位址(去掉查詢參數)作為 channelId。這時候就要建構一個共同的 chanelId,使實際觀看同一直播/影片的節點處在相同頻道中。建構 channelId 方法如下:
typescript
// 根據url建構videoId
const videoId = extractVideoIdFromUrl(originalUrl); // extractVideoIdFromUrl 需要自己定義,可以擷取url中的影片ID作為結果回傳
const url = getP2pUrl(originalUrl, videoId);WARNING
如果要與其他平台互通,則必須確保兩者擁有相同的 token 和 channelId 。
設定 HTTP 請求標頭
出於防盜鏈或統計的需求,有些 HTTP 請求需要加上 referer 或 User-Agent 等標頭資訊,可以透過 httpHeadersForHls 進行設定:
typescript
import { ConfigOptions,initP2p,getP2pUrl,getP2pEngineVersion,p2pIsConnected,stopP2p, onP2pStats, StatsObject, setHttpHeadersForHls } from "@/uni_modules/cdnbye-swarmcloud";
const headers = new Map<string, string>();
headers.set('referer' ,'xxx');
headers.set('User-Agent' ,'xxx');
setHttpHeadersForHls(headers);
const url = getP2pUrl(originalUrl);