Skip to content

P2P 設定

參考 Android, iOS 的P2P設定部分和型別定義

P2pEngine

實例化 P2pEngine,取得一個全域單例:

dart
// 初始化
FlutterP2pEngine.init(
  token, // replace with your token
  config: P2pConfig.byDefault()
);

參數說明:

參數型別是否必要說明
tokenStringSwarmCloud 分配的 token。
configP2pConfig自訂設定。

切換來源

當播放器切換到新的播放位址時,只需要將新的播放位址(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 請求需要加上 refererUser-Agent 等標頭資訊,可以透過 httpHeadersForHls 進行設定:

dart
FlutterP2pEngine.setHttpHeadersForHls({
    "referer": "XXX",
    "User-Agent": "XXX",
});

粤ICP备18075581号