環境設定
開發環境
- Android Studio 開發工具,下載位址
開啟Java8支援
在 app/build.gradle 中加入以下設定以開啟Java8支援:
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}新增相關權限
在 app/src/main 目錄中的 AndroidManifest.xml 中新增如下權限宣告:
xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />允許連線本地代理
更新 AndroidManifest.xml 檔案:
xml
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...
/>然後建立或更新 res/xml/network_security_config.xml 檔案:
xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">127.0.0.1</domain>
</domain-config>
</network-security-config>設定 LargeHeap
SDK需要占用一定的記憶體來維持內部運作,建議在 AndroidManifest.xml 檔案中設定 android:largeHeap="true" 來確保系統為應用程式分配足夠的堆積空間:
xml
<application
...
android:largeHeap="true"
...
/>混淆設定
為了保證正常使用 SDK,請在 proguard-rules.pro 檔案中加入以下程式碼:
-dontwarn com.p2pengine.**
-keep class com.p2pengine.**{*;}
-keep interface com.p2pengine.**{*;}
-keep class com.cdnbye.libdc.**{*;}
-keep interface com.cdnbye.libdc.**{*;}
-keep class com.snapchat.djinni.**{*;}匯入SDK
匯入SDK有兩種方式,一種是使用 Maven 儲存庫,另一種是下載並引入 jar 和 aar:
Maven
- 在專案的 build.gradle 中設定 SwarmCloud 的 Maven 儲存庫位址:
allprojects {
repositories {
// ... other repositories
maven {
url 'https://maven.swarmcloud.net/repository/maven-releases/'
}
}
}- 在 build.gradle 加入如下相依套件:
dependencies {
implementation("com.squareup.okhttp3:okhttp:3.12.13") // Or any okhttp newer version
implementation("com.orhanobut:logger:2.2.0")
implementation("com.google.code.gson:gson:2.9.0")
implementation("com.swarmcloud:datachannel_native:latest.release")
implementation("com.swarmcloud:p2p_engine:latest.release")
}手動下載
下載 SDK 下載最新版本的Android SDKswarmcloud.jar和datachannel.aar,並複製到工程的 libs 目錄下。
修改 build.gradle 在 build.gradle 加入如下相依套件:
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
implementation("com.squareup.okhttp3:okhttp:3.12.13") // Or any okhttp newer version
implementation("com.orhanobut:logger:2.2.0")
implementation("com.google.code.gson:gson:2.9.0")
}TIP
由於模擬器執行環境問題,請在實機進行除錯。
快速開始
建議在 Application.OnCreate() 中啟動P2P加速服務。
匯入 P2pEngine
kotlin
import com.p2pengine.sdk.P2pEnginejava
import com.p2pengine.sdk.P2pEngine;實例化 P2pEngine
kotlin
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
val config = P2pConfig.Builder()
.trackerZone(TrackerZone.Europe) // Set HongKong or USA if you changed zone
.insertTimeOffsetTag(0.0)
.build()
P2pEngine.init(this, YOUR_TOKEN, config)
}
}java
class MyApplication extends android.app.Application {
protected void onCreate() {
super.onCreate();
P2pConfig config = new P2pConfig.Builder()
.trackerZone(TrackerZone.Europe) // Set HongKong or USA if you changed zone
.insertTimeOffsetTag(0.0)
.build();
P2pEngine.init(this, YOUR_TOKEN, config);
}
}其中 YOUR_TOKEN 是用於標識使用者的字串,請換成自己的token,點擊這裡查看如何註冊 Appid 並取得 token。
播放 HLS/MPEG-DASH
進行串流媒體播放,必須透過SDK把播放位址轉換成本地加速位址,再把轉換後的位址傳給播放器即可。
kotlin
private void onPlay(){
val parsedUrl = P2pEngine.instance!!.parseStreamUrl(YOUR_STREAM)
mediaPlayer.play(parsedUrl);
}java
private void onPlay(){
String parsedUrl = P2pEngine.getInstance().parseStreamUrl(YOUR_STREAM);
mediaPlayer.play(parsedUrl);
}綁定播放器
如果您使用的播放器是 Exoplayer,直播情境下建議透過 setPlayerInteractor 來取得播放器即時回饋。
kotlin
P2pEngine.instance?.setPlayerInteractor(object : PlayerInteractor() {
override fun onBufferedDuration(): Long {
// Exoplayer in milliseconds
return if (player != null) {
player!!.bufferedPosition - player!!.currentPosition
} else {
-1
}
}
})java
P2pEngine.getInstance().setPlayerInteractor(new PlayerInteractor() {
public long onBufferedDuration() {
// Exoplayer in milliseconds
if (play != null) {
return player.getBufferedPosition() - player.getCurrentPosition();
}
return -1;
}
});範例
取得完整的範例程式
P2P無效問題排查步驟
請參考常見問題
