Skip to content

P2P 配置

参考 AndroidiOS 的P2P配置部分。

P2pEngine

实例化 P2pEngine,获得一个全局单例:

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

参数说明:

参数类型是否必须说明
tokenStringSwarmCloud 分配的 token。
configP2pConfig自定义配置。

切换源

当播放器切换到新的播放地址时,只需要将新的播放地址(m3u8)传给 parseStreamURL ,从而获取新的本地播放地址:

dart
String parsedUrl = await FlutterP2pEngine.parseStreamURL(url);
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,
])

/// 获取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()
/// 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,
])

/// 获取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;
  },
);
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);
// 根据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
P2pConfig(
  httpHeadersForHls: {
    "referer": "XXX",
    "User-Agent": "XXX",
  }
)
P2pConfig(
  httpHeadersForHls: {
    "referer": "XXX",
    "User-Agent": "XXX",
  }
)

粤ICP备18075581号