同步操作将从 cdnbye/flutter-p2p-engine 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
title |
---|
API文档 |
用建造者模式实例化 P2pConfig,以下的参数是默认值:
/// 打印日志的级别
final P2pLogLevel logLevel;
/// 通过webRTCConfig来修改WebRTC默认配置
final Map<String, dynamic> webRTCConfig;
/// 信令服务器地址
final String wsSignalerAddr;
/// tracker服务器地址
final String announce;
/// 点播模式下P2P在磁盘缓存的最大数据量(设为0可以禁用磁盘缓存)
final int diskCacheLimit;
/// P2P在内存缓存的最大数据量,用ts文件个数表示,仅安卓有效
final int memoryCacheCountLimit;
// @Deprecated('Use memoryCacheCountLimit now')
// 仅iOS有效
final int memoryCacheLimit;
/// 开启或关闭p2p engine
final bool p2pEnabled;
/// HTTP下载ts文件超时时间
final Duration downloadTimeout;
/// datachannel下载二进制数据的最大超时时间
final Duration dcDownloadTimeout;
/// 用户自定义的标签,可以在控制台查看分布图
final String tag;
/// 本地代理服务器的端口号
final int localPort;
/// 最大连接节点数量
final int maxPeerConnections;
/// 在可能的情况下使用Http Range请求来补足p2p下载超时的剩余部分数据
final bool useHttpRange;
/// 是否只在wifi和有线网络模式上传数据(建议在云端设置)
final bool wifiOnly;
/// 设置请求ts和m3u8时的HTTP请求头
final Map<String, String> httpHeaders;
/// 如果使用自定义的channelId,则此字段必须设置,且长度必须在5到15个字符之间,建议设置成你所在组织的唯一标识
final String channelIdPrefix;
/// 如果运行于机顶盒请设置成true
final bool isSetTopBox;
P2pConfig({
this.logLevel: P2pLogLevel.warn,
this.webRTCConfig: const {}, // TODO: 默认值缺少
this.wsSignalerAddr: 'wss://signal.cdnbye.com',
this.announce: 'https://tracker.cdnbye.com/v1',
this.diskCacheLimit: 1024 * 1024 * 1024,
this.memoryCacheLimit: 60 * 1024 * 1024,
this.memoryCacheCountLimit: 30,
this.p2pEnabled: true,
this.downloadTimeout: const Duration(seconds: 10),
this.dcDownloadTimeout: const Duration(seconds: 4),
this.tag: "flutter",
this.localPort: 52019,
this.maxPeerConnections: 10,
this.useHttpRange: true,
this.wifiOnly: false,
this.httpHeaders,
this.channelIdPrefix: "cdnbye",
this.isSetTopBox: false,
});
实例化P2pEngine,获得一个全局单例:
// 初始化
Cdnbye.init(
'ZMuO5qHZg', // replace with your token
config: P2pConfig(
logLevel: P2pLogLevel.debug,
),
infoListener: _listen,
segmentIdGenerator: (level, sn, url) {
// TODO: segmentIdGenerator
return url;
},
);
参数说明:
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
token | String | 是 | CDNBye分配的token。 |
config | P2pConfig | 否 | 自定义配置。 |
infoListener | CdnByeInfoListener | 否 | 监听p2p信息更新 |
segmentIdGenerator | String Function(int level, int sn, String url) | 否 | 生成SegmentId |
当播放器切换到新的播放地址时,只需要将新的播放地址(m3u8)传给 Cdnbye,从而获取新的本地播放地址:
String url = await Cdnbye.parseStreamURL(oldUrl);
/// The version of SDK. SDK的版本号
static Future<String> get platformVersion
/// Create a new instance with token and the specified config.
static Future<int> init(
token, {
P2pConfig config,
CdnByeInfoListener infoListener,
String Function(int level, int sn, String url) segmentIdGenerator,
})
/// Get parsed local stream url by passing the original stream url(m3u8) to CBP2pEngine instance.
static Future<String> parseStreamURL(
String sourceUrl, [
String videoId,
])
/// Get the connection state of p2p engine. 获取P2P Engine的连接状态
static Future<bool> isConnected()
/// Restart p2p engine.
static Future restartP2p()
/// Stop p2p and free used resources.
static Future stopP2p()
/// Get the peer ID of p2p engine. 获取P2P Engine的peer ID
static Future<String> getPeerId()
请参考example
中的例子。
::: warning 下载和上传数据量的单位是KB。 :::
某些流媒体提供商的m3u8是动态生成的,不同节点的m3u8地址不一样,例如example.com/clientId1/streamId.m3u8和example.com/clientId2/streamId.m3u8, 而本插件默认使用m3u8地址(去掉查询参数)作为channelId。这时候就要构造一个共同的chanelId,使实际观看同一直播/视频的节点处在相同频道中。构造channelId方法如下:
// 根据url构造ChannelId
String channelId = oldUrl.split('/').last;
String url = await Cdnbye.parseStreamURL(oldUrl,channelId);
::: warning 如果要与其他平台互通,则必须确保两者拥有相同的 channelIdPrefix 和 channelId 。 :::
类似动态m3u8路径问题,相同ts文件的路径也可能有差异,这时候需要忽略ts路径差异的部分。插件默认用ts的绝地路径(url)来标识每个ts文件,所以需要通过钩子函数重新构造标识符。可以按如下设置:
// 初始化
Cdnbye.init(
'ZMuO5qHZg', // replace with your token
segmentIdGenerator: (level, sn, url) {
// TODO: return your segmentId
return url;
},
);
出于防盗链或者统计的需求,有些HTTP请求需要加上 referer 或者 User-Agent 等头信息,可以通过 httpHeaders 进行设置:
P2pConfig(
httpHeaders: {
"referer": "XXX",
"User-Agent": "XXX",
}
)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。