P2P 設定
P2pEngine
實例化 P2pEngine,取得一個全域單例:
dart
// 初始化
FlutterP2pEngine.init(
token, // replace with your token
config: P2pConfig.byDefault()
);參數說明:
| 參數 | 型別 | 是否必要 | 說明 |
|---|---|---|---|
| token | String | 是 | SwarmCloud 分配的 token。 |
| config | P2pConfig | 是 | 自訂設定。 |
切換來源
當播放器切換到新的播放位址時,只需要將新的播放位址(m3u8)傳給 parseStreamURL,從而取得新的本地播放位址:
dart
String parsedUrl = await FlutterP2pEngine.parseStreamURL(url);FlutterP2pEngine API
dart
/// SDK的版本號
static Future<String> getSDKVersion()
/// 實例化P2pEngine,取得一個全域單例。
static Future<int> init(
token, {
P2pConfig config,
void Function(Map<String, dynamic>)? infoListener,
})
/// 將原始播放位址(m3u8)轉換成本地代理伺服器的位址,同時傳入videoId用以建構channelId。
static Future<String> parseStreamURL(
String sourceUrl, [
String videoId,
])
/// 動態設定請求ts和m3u8時的HTTP請求標頭。
static Future setHttpHeadersForHls(Map<String, String>? headers)
/// 動態設定請求Dash檔案時的HTTP請求標頭。
static Future setHttpHeadersForDash(Map<String, String>? headers)
/// 取得P2P Engine的連線狀態
static Future<bool> isConnected()
/// 重新啟動P2P加速服務,一般不需要呼叫。
static Future restartP2p()
/// 停止P2P加速並釋放資源,一般不需要呼叫。SDK採用「延遲釋放」的策略,只有在重新啟動p2p的時候才釋放資源。對於效能較差的裝置起播耗時可能比較明顯,建議在影片播放之前提前呼叫 engine.stopP2p() 。
static Future stopP2p()
/// 取得P2P Engine的peer ID
static Future<String> getPeerId()P2P 統計
請參考 example。
WARNING
下載和上傳資料量的單位是 KB。
回呼播放器資訊
在直播模式下,為了增強 P2P 效果並提高播放流暢度,建議透過 bufferedDurationGenerator,將從目前播放時間到緩衝前沿的時間間隔回呼給 p2p engine。
dart
FlutterP2pEngine.init(
token, // replace with your token
bufferedDurationGeneratorEnable: true,
);
String parsedUrl = await FlutterP2pEngine.parseStreamURL(
url,
bufferedDurationGenerator: () {
return vpController!.value.buffered.last.end - vpController!.value.position;
},
);解決動態 m3u8 路徑問題
某些串流媒體提供商的 m3u8 是動態產生的,不同節點的 m3u8 位址不一樣,例如 example.com/clientId1/streamId.m3u8 和 example.com/clientId2/streamId.m3u8, 而本外掛程式預設使用 m3u8 位址(去掉查詢參數)作為 channelId。這時候就要建構一個共同的 chanelId,使實際觀看同一直播/影片的節點處在相同頻道中。建構 channelId 方法如下:
dart
// 根據url建構videoId
String videoId = extractVideoIdFromUrl(originalUrl); // extractVideoIdFromUrl 需要自己定義,可以擷取url中的影片ID作為結果回傳
String url = await FlutterP2pEngine.parseStreamURL(originalUrl, videoId);WARNING
如果要與其他平台互通,則必須確保兩者擁有相同的 token 和 channelId 。
設定 HTTP 請求標頭
出於防盜鏈或統計的需求,有些 HTTP 請求需要加上 referer 或 User-Agent 等標頭資訊,可以透過 httpHeadersForHls 進行設定:
dart
FlutterP2pEngine.setHttpHeadersForHls({
"referer": "XXX",
"User-Agent": "XXX",
});