SwarmCloud

vuePress-theme-reco SwarmCloud    2018 - 2022
P2P流媒體引擎 P2P流媒體引擎

Choose mode

  • dark
  • auto
  • light
線上文檔
  • 快速入門
  • Web SDK

    • HLS
    • dash.js
    • Shaka-Player
    • MP4
    • 大文件下載
  • 安卓/安卓TV SDK

    • v2 (Java)
    • v3 (Kotlin, beta)
  • iOS/tvOS/macOS SDK
定價
關於我們
生態
實時地球
管理面板
GitHub (opens new window)
language
  • English
  • 中文

線上文檔
  • 快速入門
  • Web SDK

    • HLS
    • dash.js
    • Shaka-Player
    • MP4
    • 大文件下載
  • 安卓/安卓TV SDK

    • v2 (Java)
    • v3 (Kotlin, beta)
  • iOS/tvOS/macOS SDK
定價
關於我們
生態
實時地球
管理面板
GitHub (opens new window)
language
  • English
  • 中文
  • 快速入門
  • 常見問題
  • Tracker服務
  • 信令服務
  • P2P優化
  • 控製臺

  • HLS Double Engine

  • 安卓 SDK v2

  • 安卓 SDK v3

  • iOS/tvOS/macOS SDK

  • Flutter SDK

  • Hls.js SDK

  • HLS via ServiceWorker

    • 簡介
    • 使用方法
    • API文档
      • 实例化 P2PEngineIOS
      • P2PEngineIOS API
      • P2PEngineIOS 事件
      • HlsProxy API
      • 高级用法
    • 更新日誌
  • Shaka-Player SDK

  • Web MP4 SDK

  • Dash.js SDK

  • 大文件下載 SDK

  • 更多

API文档

vuePress-theme-reco SwarmCloud    2018 - 2022

API文档


SwarmCloud

# 实例化 P2PEngineIOS

# var engine = new P2PEngineIOS(p2pConfig);

创建一个 P2PEngineIOS 实例。

如果指定了 p2pConfig ,那么对应的默认值将会被覆盖。

字段 类型 默认值 描述
logLevel string|boolean 'error' log的等级,分为warn、error、none,设为true等于warn,设为false等于none。
token string undefined token用于控制台多域名数据汇总展示,另外如果自定义channelId也需要设置token。
announce string 'https://tracker.cdnbye.com/v1' tracker服务器地址。
announceLocation string 'cn' tracker服务器地址的国家代号,分为'cn'、'hk'、'us'。
memoryCacheLimit Object {"pc": 800 * 1024 * 1024, "mobile": 500 * 1024 * 1024} p2p缓存的最大数据量,分为PC和mobile。
p2pEnabled boolean true 是否开启P2P。
webRTCConfig Object {} 用于配置stun和datachannel的字典 (opens new window)。
tag string '' 用户自定义标签。
swFile string './sw.js' ServiceWorker文件名和路径.
swScope string './' ServiceWorker默认作用域是当前目录以及所有子目录,因此如果将 sw.js 放在网站根目录,那么所有网站请求都在 ServiceWorker 控制范围内。
nativePlaybackOnly boolean false 仅在不支持MSE的设备(如iOS浏览器)开启P2P,用于和hlsjs-p2p-engine配合使用
videoElem HTMLVideoElement|string undefined 指定video标签的id或者Element对象,默认是document中的第一个video元素。
useHttpRange boolean true 在可能的情况下使用Http Range请求来补足p2p下载超时的剩余部分数据。
httpLoadTime number 2.0 P2P下载超时后留给HTTP下载的时间。
geoIpPreflight boolean true 向在线IP数据库请求ASN等信息,从而获得更准确的调度,会延迟P2P启动时间。
sharePlaylist boolean false 是否允许m3u8文件的P2P传输。

# P2PEngineIOS API

# P2PEngineIOS.version (static)

获取 P2PEngineIOS 的版本号。

# P2PEngineIOS.protocolVersion (static)

获取 P2P 协议的版本号。

# P2PEngineIOS.isSupported() (static)

判断当前浏览器是否支持 WebRTC datachannel 和 ServiceWorker 。

# P2PEngineIOS.isMSESupported() (static)

判断当前浏览器是否支持 MEDIA SOURCE EXTENSIONS 。

# P2PEngineIOS.isWebRTCSupported() (static)

判断当前浏览器是否支持 WebRTC datachannel 。

# P2PEngineIOS.isSeviceWorkerSupported() (static)

判断当前浏览器是否支持 ServiceWorker 。

# engine.registerServiceWorker()

注册 ServiceWorker 并返回一个 promise。

# engine.unregisterServiceWorker()

销毁 ServiceWorker 并返回一个 promise。

# engine.enableP2P()

启动 p2p 。

# engine.disableP2P()

停止 p2p 并释放资源。

# engine.restartP2p()

重启 p2p 。

# engine.destroy()

停止p2p、销毁engine并释放内存。

# P2PEngineIOS 事件

# engine.on('peerId', function (peerId) {})

当从服务端获取到peerId时回调该事件。

# engine.on('peers', function (peers) {})

当与新的节点成功建立p2p连接时回调该事件。

# engine.on('stats', function (stats) {})

该回调函数可以获取p2p信息,包括:
stats.totalHTTPDownloaded: 从HTTP(CDN)下载的数据量(单位KB)
stats.totalP2PDownloaded: 从P2P下载的数据量(单位KB)
stats.totalP2PUploaded: P2P上传的数据量(单位KB)
stats.p2pDownloadSpeed: P2P下载速度(单位KB/s)

# engine.on('serverConnected', function (connected) {})

当连接/断开websocket时回调该事件。

# engine.on('exception', function (e) {})

该回调函数可以获取SDK的异常信息,包括:
e.code: 异常标识(TRACKER_EXPT SIGNAL_EXPT)
e.message: 异常信息
e.stack: 异常堆栈信息

# 通过p2pConfig获取p2p信息

p2pConfig: {
    getStats: function (totalP2PDownloaded, totalP2PUploaded, totalHTTPDownloaded, p2pDownloadSpeed) {
        // 获取p2p下载信息
    },
    getPeerId: function (peerId) {
        // 获取本节点的Id
    },
    getPeersInfo: function (peers) {
        // 获取成功连接的节点的信息
    }
}

# 用于SDK自动初始化场景的全局变量

字段 类型 默认值 描述
window.disableP2pEngineIOSAutoInit boolean false 默认情况下SDK会在页面加载完成后自动注册 ServiceWorker 并用默认配置初始化,可以用这个字段取消默认行为
window.p2pEngineIOSNativePlaybackOnly boolean false 仅在不支持MSE的设备(如iOS浏览器)开启P2P,用于和hlsjs-p2p-engine配合使用
window.p2pEngineIOSAnnounceLocation string 'cn' tracker服务器地址的国家代号,分为'cn'、'hk'、'us'

# HlsProxy API

# new HlsProxy(config);

创建一个 HlsProxy 实例。

如果指定了 config ,那么对应的默认值将会被覆盖。

字段 类型 默认值 描述
httpHeadersForPlaylist function(url, headers) null 设置m3u8请求的自定义http头,如:httpHeadersForPlaylist: (url, headers) => { headers.set('token', 'xxx') }
httpHeadersForMediaFile function(url, headers) null 设置ts请求的自定义http头,如:httpHeadersForMediaFile: (url, headers) => { headers.set('token', 'xxx') }
insertTimeOffsetTag boolean true 仅在直播模式生效,在m3u8文件中插入 #EXT-X-START:TIME-OFFSET=0.01 ,强制播放器从m3u8的第一个ts开始加载
allowedMediaFiles Array undefined 需要支持的额外的媒体文件后缀,如 ['txt', 'png']

# HlsProxy.version (static)

获取 HlsProxy 的版本号。

# 高级用法

# 解决动态m3u8路径问题

某些流媒体提供商的m3u8是动态生成的,不同节点的m3u8地址不一样,例如example.com/clientId1/streamId.m3u8和example.com/clientId2/streamId.m3u8,而本插件默认使用m3u8地址(去掉查询参数)作为channelId。这时候就要构造一个共同的chanelId,使实际观看同一直播/视频的节点处在相同频道中。

// 必须先在 p2pConfig 设置 token ,才能自定义 channelId ! 与其他平台互通需要相同的 token 和 channelId 。
p2pConfig: {
    token: YOUR_TOKEN,
    channelId: function (m3u8Url) {
        const videoId = extractVideoIdFromUrl(m3u8Url);   // 忽略差异部分,构造一个一致的channelId,其中 extractVideoIdFromUrl 需要自己定义,可以抽取url中的视频ID作为结果返回
        return videoId;
    }
}

用 http://example.com/token123456/video1/playlist.m3u8 来举例, 其中 token123456 是根据不同用户产生的token,video1 是视频的唯一ID。

p2pConfig: {
    token: YOUR_TOKEN,
    channelId: function (m3u8Url) {
        var parts = m3u8Url.split('/');
        var videoId = parts[parts.length-2]+'/'+parts[parts.length-1];
        return videoId;
    }
}

按如上配置后,结果如下,token被去掉,只保留video ID:

<!-- URL to be replaced -->
http://example.com/token123456/video1/playlist.m3u8
<!-- Resulting channelId -->
video1/playlist.m3u8

如果要与其他平台互通,则必须确保两者拥有相同的 token 和 channelId 。

# 解决动态ts路径问题

类似动态m3u8路径问题,相同ts文件的路径也可能有差异,这时候需要忽略ts路径差异的部分。插件默认用ts的绝地路径(url)来标识每个ts文件,所以需要通过钩子函数重新构造标识符。可以按如下设置:

p2pConfig: {
    /*
        streamId: The id of stream
        sn: The serial number of segment
        segmentUrl: The url of segment
     */
    segmentId: function (streamId, sn, segmentUrl, range) {
        const tsId = extractSegmentIdFromUrl(segmentUrl);
        return tsId;
    }
}