快速开始
5 分钟为你的视频平台接入 P2P 分布式加速,节省 60%+ CDN 带宽成本。
什么是 P2PStorm
P2PStorm 是一款融合 P2P 传输、智能缓存、边缘预加载 的视频/直播分布式加速引擎。SDK 在播放器层面透明工作,无需修改 CDN 配置和视频源,通过 WebRTC 让观众之间直接共享已缓存的视频分片,大幅降低回源流量,同时保证播放体验零损失。
核心优势
5 分钟接入流程
选择你的播放器平台,按照下方对应文档操作即可。
Web 接入(HLS.js)
适用于使用 HLS.js 播放器的 Web 项目。3 步完成接入。
通过 npm 安装:
npm install @p2pstorm/hlsjs hls.js
或通过 CDN 引入:
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script src="https://cdn.jsdelivr.net/npm/@p2pstorm/hlsjs@latest"></script>
import Hls from 'hls.js';
import { HlsJsP2PEngine } from '@p2pstorm/hlsjs';
// 注入 P2P 加速能力
HlsJsP2PEngine.injectMixin(Hls);
// 创建播放器实例
const hls = new Hls({
p2p: {
core: {
announceTrackers: ['wss://tracker.p2pstorm.vip'],
// 缓存上限 MiB(可选,默认自动适配设备)
// segmentMemoryStorageLimit: 2048,
}
}
});
hls.loadSource('https://your-cdn.com/video.m3u8');
hls.attachMedia(document.getElementById('video'));
打开浏览器开发者工具(F12),在 Console 中搜索 p2pml 相关日志。看到 Peer 连接信息即表示 P2P 已生效。
Web 接入(Shaka Player)
适用于使用 Shaka Player 的 Web 项目,支持 HLS 和 DASH 格式。
npm install @p2pstorm/shaka shaka-player
import shaka from 'shaka-player';
import { ShakaP2PEngine } from '@p2pstorm/shaka';
// 创建 P2P 引擎
const engine = new ShakaP2PEngine({
core: {
announceTrackers: ['wss://tracker.p2pstorm.vip'],
// segmentMemoryStorageLimit: 2048, // 可选,缓存上限 MiB
}
});
// 创建 Shaka Player 并绑定
const player = new shaka.Player();
await player.attach(document.getElementById('video'));
// 注入 P2P 能力
engine.bindShakaPlayer(player);
// 加载视频
await player.load('https://your-cdn.com/video.m3u8');
同样在浏览器控制台搜索 p2pml 日志确认 P2P 连接已建立。
Android 接入(ExoPlayer)
适用于 Android 原生应用,基于 AndroidX Media3 ExoPlayer。
在 build.gradle.kts 中添加:
// build.gradle.kts
dependencies {
implementation("com.github.avan6688:P2PStorm-Mobile:main-SNAPSHOT")
implementation("androidx.media3:media3-exoplayer:1.5.1")
implementation("androidx.media3:media3-exoplayer-hls:1.5.1")
}
在 settings.gradle.kts 中添加 JitPack 仓库:
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
maven("https://jitpack.io")
}
}
import com.p2pstorm.sdk.P2PMediaLoader
val p2pLoader = P2PMediaLoader(
onP2PReadyCallback = { /* P2P 引擎就绪 */ },
onP2PReadyErrorCallback = { error -> /* 处理错误 */ },
coreConfigJson = """
{
"announceTrackers": ["wss://tracker.p2pstorm.vip"]
}
"""
)
// 启动 P2P 并绑定 ExoPlayer
p2pLoader.start(context, exoPlayer)
// 获取 P2P 代理地址
val p2pUrl = p2pLoader.getManifestUrl("https://your-cdn.com/video.m3u8")
val mediaItem = MediaItem.fromUri(p2pUrl)
exoPlayer.setMediaItem(mediaItem)
exoPlayer.prepare()
exoPlayer.play()
AndroidManifest.xml 中已声明 INTERNET 权限。iOS 接入(AVPlayer)
适用于 iOS/tvOS/macOS 原生应用,基于 AVPlayer。
在 Xcode 中通过 Swift Package Manager 添加:
// Package.swift 或 Xcode → File → Add Package Dependencies
.package(url: "https://github.com/avan6688/P2PStorm-iOS.git", from: "1.0.0")
import P2PStormSDK
import AVFoundation
let p2pLoader = P2PMediaLoader(
coreConfigJson: """
{
"announceTrackers": ["wss://tracker.p2pstorm.vip"]
}
"""
)
// 启动 P2P 并绑定 AVPlayer
let player = AVPlayer()
p2pLoader.start(player: player)
// 获取 P2P 代理 URL
let p2pUrl = p2pLoader.getManifestUrl("https://your-cdn.com/video.m3u8")
// 用代理 URL 播放
let playerItem = AVPlayerItem(url: URL(string: p2pUrl)!)
player.replaceCurrentItem(with: playerItem)
player.play()
// 页面销毁时停止 P2P
p2pLoader.stop()
直播接入
直播流和点播流的接入方式完全一样 — HLS 直播流直接传入 m3u8 地址即可,SDK 自动识别直播/点播模式。
直播推荐配置
直播对延迟要求更高,建议缩短 P2P 超时时间,保证低延迟体验:
const hls = new Hls({
p2p: {
core: {
appKey: 'YOUR_APP_KEY',
announceTrackers: ['wss://tracker.p2pstorm.vip'],
p2pNotReceivingBytesTimeoutMs: 800, // 直播场景:800ms 超时降级
// 直播不需要设 segmentMemoryStorageLimit,SDK 自动管理
}
}
});
配置参数
所有参数写在 p2p.core 对象中。大多数场景保持默认即可,无需修改任何参数。
| 参数 | 默认值 | 说明 |
|---|---|---|
| 常用配置 | ||
announceTrackers | 已内置 | Tracker 地址,默认已配置,一般不需要改 |
segmentMemoryStorageLimit | 自动(桌面 4096 / 安卓 2048 / iOS 1024) | 缓存上限(MiB)。点播保持默认即可,移动端内存紧张可调小。直播不需要设置 |
isP2PDisabled | false | 关闭 P2P(调试用) |
| 高级配置(一般不需要修改) | ||
highDemandTimeWindow | 15 | 高优先预加载时间窗口(秒) |
httpDownloadTimeWindow | 3000 | HTTP 预加载时间窗口(秒) |
p2pDownloadTimeWindow | 6000 | P2P 预加载时间窗口(秒) |
simultaneousHttpDownloads | 2 | 同时 CDN 下载数 |
simultaneousP2PDownloads | 3 | 同时 P2P 下载数 |
httpDownloadInitialTimeoutMs | 2000 | 首次加载延迟(ms),给 Tracker 发现 Peer 的时间 |
p2pNotReceivingBytesTimeoutMs | 2000 | P2P 超时降级(ms),直播建议 800 |
httpNotReceivingBytesTimeoutMs | 3000 | HTTP 超时(ms) |
httpErrorRetries | 3 | HTTP 失败重试次数 |
p2pErrorRetries | 3 | P2P 失败重试次数 |
webRtcMaxMessageSize | 65535 | WebRTC 最大消息(bytes) |
统计上报
SDK 默认自动将 P2P/CDN 流量数据上报到控制台,你可以在「数据统计」页面查看实时和历史数据。
手动监听事件
如需在业务代码中获取 P2P 事件,可以监听以下事件:
// 新 Peer 连接
hls.on('p2pml-peer-connect', (event, data) => {
console.log('Peer connected:', data.peerId);
});
// 分片加载完成
hls.on('p2pml-segment-loaded', (event, data) => {
console.log('Source:', data.downloadSource);
// data.downloadSource: "p2p" | "http"
});
常见问题
httpDownloadInitialTimeoutMs 默认为 0,首帧直接走 CDN,P2P 只在后续分片中介入,完全不影响起播速度。