常見問題
# 基礎
# 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服務
- 每個賬號每日免費贈送5GB P2P流量,次日重置
- 每日在控製臺完成簽到後再贈送20GB 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對應的字符串即需要的應用簽名。