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",
});