Skip to content

環境設定

開發環境

開啟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.P2pEngine
java
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無效問題排查步驟

請參考常見問題

粤ICP备18075581号