常见问题
# 基础
# P2P服务停止后会影响视频的正常播放吗?
不会。视频仍会正常播放,只是没有P2P加速效果。
# SwarmCloud的P2P服务安全吗?
SwarmCloud采用的WebRTC data channel技术,是基于SCTP协议和DTLS加密的,无需担心数据传输的安全问题。另外,与后台服务器的通信(包括tracker和信令服务器)是基于安全的HTTPS和WSS。隐私方面,SwarmCloud不会在服务器缓存任何视频内容相关的信息,视频地址也做了加密处理。
# 支持加了防盗链或者加密的视频地址吗?
支持的,请提供加密原理以及测试地址给我们的技术支援团队。
# 集成了SwarmCloud后会造成直播延迟吗?
不会的,由于前几个切片从CDN拉取,因此不会给起播带来任何延迟。然而低延迟直播可能会使P2P效果下降,建议 HLS / Dash 的 playlist 遵循以下配置:
切片时长: 至少3秒
Playlist包含的切片数: 至少6个
# 微信小程序可以使用吗?
暂时不支持微信小程序
# 使用SwarmCloud的P2P服务需要付费吗?
目前SwarmCloud已经开始商业化,但同时对小型流媒体网站仍提供免费服务。收费模式如下:
- 只对在管理面板(https://www.cdnbye.com/oms) 绑定的域名提供P2P服务
- 每个账号每日免费赠送25GB P2P流量,次日重置
- 每日在管理面板完成签到后再赠送25GB P2P流量,次日清零
- 超出免费额度后停止P2P服务,如果继续使用,需要购买流量包,购买的流量包额度越大,价格越划算,且可以使用更多P2P流量,直到剩余可用流量为零。
# 如何购买流量包?
登入 https://www.cdnbye.com/oms,点击左边侧滑栏的 购买流量包 ,目前支援支付宝和Paypal两种付款方式,其中支付宝以人民币付款,Paypal以美元付款。
# 如果绑定了多个域名/AppId,购买流量包后怎么扣费呢?
如果您在同一个账号同时绑定了多个域名/APP,则开启P2P的所有域名/APP会共享流量包。您可以在管理面板的 P2P配置 关闭某个域名的P2P服务从而节省流量包消耗。
# 购买了包月套餐后每日额度不够用怎么办?
建议再买个流量包作为补充,系统会先扣除包月套餐流量,扣完再扣除流量包流量。
# 如何查看集成后有没有效果?
- 确保已经打开2个以上播放同一个m3u8的客户端
- 确保按文档提供的步骤集成,并且SDK没有任何报错信息
- 打开管理面板切换对应域名即可查看p2p流量
- 每个平台的SDK都会提供API来监听p2p流量等统计信息,请参考对应的文档说明
# 对接入P2P服务的网站/APP有什么要求吗?
SwarmCloud不对色情等非法内容提供P2P服务,请确保您的网站/APP符合法律规范。服务于国内的域名必须已备案。
# SwarmCloud会不会造成用户视频播放延迟?
不会。首先,视频的首片数据总是从CDN下载的,因而不会造成首屏延迟。其次,如果在超时时间内无法从其他节点获取数据,那么内置的调度算法会及时切到CDN下载,因此本P2P技术不会带来任何额外的延迟。
# 使用过程中出现异常如何反馈?
如果是Web端插件的异常请在p2p配置中开启log并截图浏览器console出错信息发送到service@cdnbye.com,或者在QQ群里反馈。如果是原生SDK出现异常请在p2p配置中开启log并保存日志文件发送到官方邮箱,建议在APP中集成Bugly (opens new window),有助于收集crash日志并上传到云端。
# 如何在内网使用SwarmCloud?
使用SwarmCloud的p2p服务需要调用两个云端服务,一个是Tracker调度服务,另一个是信令服务。
# 信令服务
可以直接在内网服务器上部署信令服务 (opens new window),信令不需要与外网通信。
# Tracker服务
Tracker需要通过能与外网通信的服务器进行转发,操作步骤如下:
- 在管理面板绑定网站域名
- 联系SwarmCloud技术人员对转发域名进行授权
- 在服务器配置nginx内网转发,在conf.d增加tracker.conf,示例如下:同时在nginx.conf添加如下配置:
server { listen 80; listen 443 ssl; server_name YOUR_TRACKER_DOMAIN; # 配置内网转发域名 access_log /root/log/access.log; error_log /root/log/error.log; # ssl on; ssl_certificate tracker.pem; # 证书路径 ssl_certificate_key tracker.key; # 证书秘钥路径 location / { proxy_pass https://tracker.cdnbye.com; # 转发到SwarmCloud的tracker服务 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; } }
worker_rlimit_nofile 1000000; # 配置Nginx worker进程最大打开文件数 events { worker_connections 102400; # 单个进程允许的客户端最大连接数 }
- 执行重新加载 Nginx
sudo nginx -s reload
- 确认公司防火墙对 Nginx 服务器 IP 及端口限制访问解除
- 修改前端代码,替换Tracker域名为转发域名
p2pConfig: { announce: 'http://your_traclker.com/v1', }
- 执行重新加载 Nginx
# SwarmCloud的效果如何?如果使用过程效果不如预期,应该怎么调整?
如果您使用过程中无法达到预期效果,请参照P2P优化对各参数进行调整,或者联系本平台获取技术支援。
# SwarmCloud的P2P技术会影响DRM(数字版权管理)吗?
不会。只有在用户获得发布者的服务器授权后才会激活P2P传输。而且,流秘钥是不会在P2P网络中 传输的。P2P网络中传输的ts文件和用户从CDN下载的完全一样。另外,播放的内容不会上传或者缓存在我们的服务器中。
# 平时在线人数不多有必要用P2P吗?
有。P2P的独特优势是带宽"削峰",平时在线人数不多的时候效果不明显,一旦在观看高峰期带宽突然大幅增长,随著在线人数增多P2P分享率指数式上升,可有效降低带宽峰值,避免由于带宽不足导致用户播放卡顿等问题。
# Web SDK
# Web SDK的原理是什么?
SwarmCloud采用WebRTC data channel技术和BT算法来实现直播和点播的P2P加速。通过内置的调度算法, 在P2P和CDN之间进行无缝切换,从而在不影响用户播放体验的前提下最大化P2P率。hlsjs-p2p-engine 是SwarmCloud为播放HLS流而开发的hls.js插件。目前,SwarmCloud已经支援大部分的HTML5播放器,包括 Hls.js, JWPlayer, Video.js, Clappr, Flowplayer和TCPlayer等。
# iOS浏览器是否不支援P2P?
由于iOS的浏览器内核不支援MSE(Media Source Extension),因此基于hls.js的SDK不支援iOS浏览器。我们已推出基于ServiceWorker的SDK,建议两个SDK同时使用从而使所有浏览器均支援P2P。
# 如果用户的浏览器不支援WebRTC,会怎麽样?
在这种情况下,插件不起任何作用,用户和往常一样采用HTTP方式下载。
# 当SDK新版本发佈时,我需要手动更新吗?
如果您用了我们提供的CDN来引入SDK,则不需要手动更新。
# 我的播放器是在 iframe 裡面的要怎麽集成?
在这种情况下,您需要在 iframe 的脚本裡集成SDK,因为 Javascript 无法从 iframe 外部访问 iframe 裡的内容。
# 目前支援的移动端浏览器有哪些?
- 谷歌浏览器
- 火狐浏览器
- 欧朋浏览器
- 微信内置浏览器
- QQ内置浏览器
- 猎豹浏览器
- 搜狗浏览器
- 百度浏览器
- 360极速浏览器
- 2345浏览器
- 遨游5浏览器
- Via浏览器
- X浏览器
- 先锋浏览器
注:以上所列出均是安卓平台,目前iOS平台还未支援,不断完善中...
# 某些移动端浏览器无法正常播放?
P2P需要浏览器同时支援MSE(Media Source Extension)和WebRTC才能使用,可以通过 SwarmCloud 提供的API进行检测,如果不支援则用原生播放器进行播放,示例如下:
if (Hls.isSupported() && Hls.WEBRTC_SUPPORT) {
// 采用SwarmCloud播放
} else {
// 采用video标签播放
}
# Web端插件P2P无效问题排查步骤
- 同时打开2个以上处于同一局域网的网页播放同一个视频
- 直播流建议按照P2P优化指南进行配置
- 视频播放后打开网页调试窗口查看debug信息
- 如果有红色的报错信息一般是代码逻辑问题,请根据提示修改
- 如果显示类似 "CDNBye 0.X.X is deprecated, please update to latest version(0.X.X已停止支援,请更新至最新版本)" 说明版本已过期,请升级至最新版
- 如果显示其它信息,请根据提示操作,有以下五种可能:
- 域名没有绑定,注意SwarmCloud后台是根据HTTP请求的Origin字段来获取域名的(如果使用iFrame该域名可能和网站域名不一致),请在后台绑定正确的域名
- 流量已经用完,请登入管理面板 (opens new window)并切换到对应域名查看流量使用情况
- 在管理面板的 P2P配置 中关闭了P2P服务,重新开启即可
- 在管理面板的 P2P配置 中激活比率调小了,重新调至100即可
- 域名被加入黑名单,登入管理面板点击 网站管理 即可确认
- 如果没有显示任何异常,请确保m3u8路径不会动态变化,否则请构造一个相同的ChannelId
- 如果以上步骤还不能解决问题,请联系技术客服
# 客户端SDK
# 安卓SDK可以用于机顶盒吗?
当然可以,只要是安卓4.4以上系统的机顶盒都支援。经过实测,exoplayer的兼容性最好,推荐采用。
# SDK除了 P2P 还有其他附加功能吗?
有的。SDK还具备智能缓存能力,用于避免文件重复下载问题,从而有效节省带宽消耗,而且本功能是完全免费的。
# 客户端SDK P2P无效问题排查步骤
- 请先确保在真机上调试
- 同时打开2个处于同一局域网的设备
- 直播流建议按照P2P优化指南进行配置
- iOS
- 在管理面板搜索关键字"P2P warning",根据对应的警告信息进行配置
- 如果仍然无法排查问题,请先将日志打印功能打开并保存为文件,示例代码如下:
let config = SWCP2pConfig.defaultConfiguration() config.logLevel = SWCLogLevel.debug config.logPersistent = true SWCP2pEngine.sharedInstance().start(token: YOUR_TOKEN, p2pConfig: config)
SWCP2pConfig *config = [SWCP2pConfig defaultConfiguration]; config.logLevel = CBLogLevelDebug; config.logPersistent = YES; [[SWCP2pEngine sharedInstance] startWithToken:YOUR_TOKEN andP2pConfig:config];
- 在 Library/Caches/Logs 找到日志文件并发送给SwarmCloud技术人员
- 安卓
- 在Logcat搜索关键字"P2P warning",根据对应的警告信息进行配置
- 如果仍然无法排查问题,请先将日志级别调整为Debug并保存为文件,示例代码如下:
P2pConfig config = new P2pConfig.Builder().logEnabled(true).logLevel(LogLevel.DEBUG).logPersistent(true).build(); P2pEngine.init(this, YOUR_TOKEN, config);
val config = P2pConfig.Builder().logEnabled(true).logLevel(LogLevel.DEBUG).logPersistent(true).build() P2pEngine.init(this, YOUR_TOKEN, config)
- 在外部存储(Environment.getExternalStorageDirectory() -> /Android/data/)中找到logger/logs_0.csv,如果找不到请尝试查看路径"/storage/emulated/0",然后将保存完整日志的csv文件发送给SwarmCloud技术人员
# 解决Exoplayer无法播放问题
Exoplayer默认不支援跨协议重定向 (opens new window),因此需要在初始化时设置 allowCrossProtocolRedirects=true,如以下示例:
DataSource.Factory dataSourceFactory =
new DefaultHttpDataSourceFactory(
Util.getUserAgent(this, "p2p-engine"),
DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS,
DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS,
true /* allowCrossProtocolRedirects */
);
具体用法可以参考官方demo (opens new window)。
# 解决安卓机顶盒OOM问题
配置比较低的机顶盒容易出现OOM,可以通过配置提高堆内存大小,在 app/src/main 目录中的 AndroidManifest.xml 的 <application>
标签中直接插入:
<application
...
android:largeHeap=“true”
...
/>
# 如何减小APK体积
由于依赖了第三方库WebRTC,使APK体积增大了不少。如果对APK体积比较敏感,可以通过以下2种方案压缩体积:
- abiFilters
编译系统的默认行为是将每个 ABI 的二进制文件包括在单个 APK(也称为胖 APK)内。与仅包含单个 ABI 的二进制文件的 APK 相比,胖 APK 要大得多;要权衡的是兼容性更广,但 APK 更大。要限制应用支援的 ABI 集,请使用 abiFilters (opens new window)。
android {
...
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "armeabi"
}
}
}
- APK 拆分
谷歌建议针对不同CPU架构生成对应的APK (opens new window):
android {
...
splits {
// 根据ABI配置生成多APK
abi {
// 是否根据不同ABI生成APK
enable true
// 默认情况下所有ABI都包含了,因此需要调用reset()并且指定我们需要的CPU架构
// 重置Gradle生成APK的ABI列表
reset()
// 指定CPU架构来生成我们需要的APK
include "armeabi-v7a", "arm64-v8a"
// 设置不再生成一个包含所有ABI的APK
universalApk false
}
}
}
# 如何获取安卓应用签名
可以使用 keytool 来获取APP的应用签名
keytool -v -list -keystore path/to/my-signing-key.keystore
在输出的证书指纹中(MD5, SHA1, SHA256),SHA1对应的字符串即需要的应用签名。