环境配置
开发环境
- Android Studio 开发工具,下载地址
开启Java8支持
在 app/build.gradle 中加入以下配置以开启Java8支持:
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
添加相关权限
在 app/src/main 目录中的 AndroidManifest.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" />
允许HTTP请求
从Android P系统开始,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响。由于本地代理服务需要使用http协议访问,针对这个问题,有以下两种解决方法:
(1) targetSdkVersion 降到27以下
(2) 更改网络安全配置,在 app/src/main 目录中的 AndroidManifest.xml 的<application>
标签中直接插入:
<application
...
android:usesCleartextTraffic="true"
...
/>
设置 LargeHeap
SDK需要占用一定的内存来维持内部运作,建议在 AndroidManifest.xml 文件中设置 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.**{*;}
导入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.cdnbye:datachannel_native:1.0.211")
implementation("com.cdnbye:p2p_engine:latest.release")
}
手动下载
下载 SDK 下载最新版本的安卓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
import com.p2pengine.sdk.P2pEngine
import com.p2pengine.sdk.P2pEngine;
实例化 P2pEngine
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)
.isSetTopBox(false) // Set it as true if SDK is running on set-top box
.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) // Set HongKong or USA if you changed zone
.insertTimeOffsetTag(0.0)
.isSetTopBox(false) // Set it as true if SDK is running on set-top box
.build();
P2pEngine.init(this, YOUR_TOKEN, config);
}
}
其中 YOUR_TOKEN 是用于标识用户的字符串,请换成自己的token,点击这里查看如何注册 Appid 并获取 token。
播放 HLS/MPEG-DASH
进行流媒体播放,必须通过SDK把播放地址转换成本地加速地址,再把转换后的地址传给播放器即可。
private void onPlay(){
val parsedUrl = P2pEngine.instance!!.parseStreamUrl(YOUR_STREAM)
mediaPlayer.play(parsedUrl);
}
private void onPlay(){
String parsedUrl = P2pEngine.getInstance().parseStreamUrl(YOUR_STREAM);
mediaPlayer.play(parsedUrl);
}
绑定播放器
如果您使用的播放器是 Exoplayer ,直播场景下建议通过 setPlayerInteractor 来获取播放器实时反馈。
P2pEngine.instance?.setPlayerInteractor(object : PlayerInteractor() {
override fun onBufferedDuration(): Long {
// Exoplayer in milliseconds
return if (player != null) {
player!!.bufferedPosition - player!!.currentPosition
} else {
-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") // 添加这一行
- Mp4/MPEG-Dash/大文件下载的API被移除
- P2pConfig 中的一些字段被移除,比如 "waitForPeer", "waitForPeerTimeout"
P2P无效问题排查步骤
请参考常见问题