Skip to content

环境配置

开发环境

开启Java8支持

app/build.gradle 中加入以下配置以开启Java8支持:

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
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" />
<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" />

允许HTTP请求

从Android P系统开始,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响。由于本地代理服务需要使用http协议访问,针对这个问题,有以下两种解决方法:
(1) targetSdkVersion 降到27以下
(2) 更改网络安全配置,在 app/src/main 目录中的 AndroidManifest.xml<application>标签中直接插入:

xml
<application
  ...
  android:usesCleartextTraffic="true"
  ...
    />
<application
  ...
  android:usesCleartextTraffic="true"
  ...
    />

设置 LargeHeap

SDK需要占用一定的内存来维持内部运作,建议在 AndroidManifest.xml 文件中设置 android:largeHeap="true" 来确保系统为应用分配足够的堆空间:

xml
<application
  ...
  android:largeHeap=“true”
  ...
    />
<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.**{*;}
-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(请使用3.5以上版本)

下载最新版本的安卓SDKswarmcloud.jar和datachannel.aar,并拷贝到工程的 libs 目录下。

修改 build.gradle

build.gradle 添加如下依赖:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
    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")
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
    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
import com.p2pengine.sdk.P2pEngine
java
import com.p2pengine.sdk.P2pEngine;
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)
    }
}
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)
                .insertTimeOffsetTag(0.0)
                .build();
        P2pEngine.init(this, YOUR_TOKEN, config);
    }
}
class MyApplication extends android.app.Application {
    protected void onCreate() {
        super.onCreate();
        P2pConfig config = new P2pConfig.Builder()
                .trackerZone(TrackerZone.Europe)
                .insertTimeOffsetTag(0.0)
                .build();
        P2pEngine.init(this, YOUR_TOKEN, config);
    }
}

其中 YOUR_TOKEN 是用于标识用户的字符串,请换成自己的token,点击这里查看如何注册 Appid 并获取 token

WARNING

如果媒体文件是由多个服务器生成的,为避免冲突,请增加以下配置:

kotlin
P2pEngine.instance?.setHlsSegmentIdGenerator(StrictHlsSegmentIdGenerator())
P2pEngine.instance?.setHlsSegmentIdGenerator(StrictHlsSegmentIdGenerator())

播放 HLS/MPEG-DASH

进行流媒体播放,必须通过SDK把播放地址转换成本地加速地址,再把转换后的地址传给播放器即可(建议使用ExoPlayer)。

kotlin
private void onPlay(){
  val parsedUrl = P2pEngine.instance!!.parseStreamUrl(YOUR_STREAM)
  mediaPlayer.play(parsedUrl);
}
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);
}
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
        }
    }
})
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;
    }
});
P2pEngine.getInstance().setPlayerInteractor(new PlayerInteractor() {
    public long onBufferedDuration() {
        // Exoplayer in milliseconds
        if (play != null) {
            return player.getBufferedPosition() - player.getCurrentPosition();
        }
        return -1;
    }
});

示例

获取完整的示例程序

从 v2 迁移

v3 的一些主要改动和优化:

  • 包名前缀由 com.cdnbye.* 改为 com.p2pengine.*
  • API level的最低要求由 19+ 升至 21+
  • okhttp 的最低版本要求是 4.5+
  • gradle依赖之一 fastjson 改为 gson
// implementation 'com.alibaba:fastjson:1.2.58'   // 删除这一行
implementation("com.google.code.gson:gson:2.9.0") // 添加这一行
// implementation 'com.alibaba:fastjson:1.2.58'   // 删除这一行
implementation("com.google.code.gson:gson:2.9.0") // 添加这一行
  • Mp4/MPEG-Dash/大文件下载的API被移除
  • P2pConfig 中的一些字段被移除,比如 "waitForPeer", "waitForPeerTimeout"

P2P无效问题排查步骤

请参考常见问题

粤ICP备18075581号