... | @@ -82,32 +82,42 @@ android { |
... | @@ -82,32 +82,42 @@ android { |
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
|
```
|
|
```
|
|
|
|
|
|
## 3.3 视频播放
|
|
## 3.3 初始化
|
|
|
|
|
|
SDK视频播放由DWMediaPlayer类实现,使用DWMediaPlayer既可播放获得场景视频云服务平台下的视频(以下简称在线播放),也可播放本地视频。播放加密视频需要启动DRMServer,启动DRMServer后可以播放加密视频和非加密视频,若只是播放非加密视频不需要启动DRMServer。
|
|
SDK视频播放由DWMediaPlayer类实现,使用DWMediaPlayer既可播放获得场景视频云服务平台下的视频(以下简称在线播放),也可播放本地视频。
|
|
|
|
|
|
从3.16.1版本开始,需要在播放器初始化之前调用,若未正常调用,SDK则会抛出RuntimeException。
|
|
从3.16.1版本开始,应用启动时调用初始化,若未正常调用,SDK则会抛出RuntimeException。
|
|
|
|
|
|
|
|
例:
|
|
|
|
|
|
```java
|
|
```java
|
|
InitializeManager.getInstance(getContext()).initialize();
|
|
InitializeManager.getInstance(getContext()).initialize();
|
|
```
|
|
```
|
|
|
|
|
|
在自定义的HuodeApplication(这个类名可以自定义)启动DRMServer:
|
|
InitializeManager:
|
|
|
|
|
|
|
|
| 方法 | 说明 |
|
|
|
|
| :----------------------------------------------- | :-------------------------------- |
|
|
|
|
| initialize() | 默认开启log,普通安全校验方式 |
|
|
|
|
| initialize(boolean isLog) | 是否开启log,默认普通安全校验方式 |
|
|
|
|
| initialize(boolean isLog, VerificationMode mode) | 是否开始log,安全校验方式 |
|
|
|
|
|
|
|
|
参数详解:
|
|
|
|
|
|
```java
|
|
```java
|
|
public class HuodeApplication extends Application {
|
|
public enum VerificationMode {
|
|
|
|
ORDINARY,//普通安全校验方式 3.20.0版本之前使用的方式
|
|
|
|
SID;//sid安全校验方式 3.20.0版本新增的sid方式
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
private static DRMServer drmServer;
|
|
注:SID的安全级别相对于ORDINARY会更高。 [SID安全校验流程详解](https://doc.bokecc.com/vod/developer/base/sdksid/sdksid.html)
|
|
private static int drmServerPort;
|
|
|
|
|
|
|
|
@Override
|
|
播放加密视频需要启动DRMServer,启动DRMServer后可以播放加密视频和非加密视频,若只是播放非加密视频不需要启动DRMServer。
|
|
public void onCreate() {
|
|
|
|
super.onCreate();
|
|
注意:启动DRMServer必须在播放视频之前启动,建议在应用启动时启动,应用销毁时释放
|
|
initDWStorage();
|
|
|
|
startDRMServer();
|
|
|
|
InitializeManager.getInstance(getContext()).initialize();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
```java
|
|
// 启动DRMServer
|
|
// 启动DRMServer
|
|
public void startDRMServer() {
|
|
public void startDRMServer() {
|
|
if (drmServer == null) {
|
|
if (drmServer == null) {
|
... | @@ -122,66 +132,19 @@ public class HuodeApplication extends Application { |
... | @@ -122,66 +132,19 @@ public class HuodeApplication extends Application { |
|
Toast.makeText(getApplicationContext(), "启动解密服务失败,请检查网络限制情况:"+e.getMessage(), Toast.LENGTH_LONG).show();
|
|
Toast.makeText(getApplicationContext(), "启动解密服务失败,请检查网络限制情况:"+e.getMessage(), Toast.LENGTH_LONG).show();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//播放加密视频调用此方法
|
|
//停止DRMServer
|
|
private void initDWStorage() {
|
|
public void stopDrmServer(){
|
|
DWSdkStorage myDWSdkStorage = new DWSdkStorage() {
|
|
|
|
private SharedPreferences sp = getApplicationContext().getSharedPreferences("mystorage", MODE_PRIVATE);
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void put(String key, String value) {
|
|
|
|
SharedPreferences.Editor editor = sp.edit();
|
|
|
|
editor.putString(key, value);
|
|
|
|
editor.commit();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String get(String key) {
|
|
|
|
return sp.getString(key, "");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
DWStorageUtil.setDWSdkStorage(myDWSdkStorage);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onTerminate() {
|
|
|
|
if (drmServer != null) {
|
|
if (drmServer != null) {
|
|
drmServer.stop();
|
|
drmServer.stop();
|
|
}
|
|
}
|
|
super.onTerminate();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int getDrmServerPort() {
|
|
|
|
return drmServerPort;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setDrmServerPort(int drmServerPort) {
|
|
|
|
this.drmServerPort = drmServerPort;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
public static DRMServer getDRMServer() {
|
|
|
|
return drmServer;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
```
|
|
|
|
|
|
在AndroidManifest.xml文件中配置自定义的HuodeApplication:
|
|
|
|
|
|
|
|
```groovy
|
|
|
|
<application
|
|
|
|
android:name=".HuodeApplication"
|
|
|
|
android:allowBackup="true"
|
|
|
|
android:icon="@mipmap/ic_launcher"
|
|
|
|
android:label="@string/app_name"
|
|
|
|
android:supportsRtl="true"
|
|
|
|
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"
|
|
|
|
android:usesCleartextTraffic="true">
|
|
|
|
```
|
|
|
|
|
|
|
|
### 3.3.1 在线播放
|
|
### 3.3.1 在线播放
|
|
|
|
|
|
使用SDK的在线播放功能时,需设置视频ID、账户ID、API_KEY及Context(上下文信息)即可播放云端视频。具体实现方式如下:
|
|
使用SDK的在线播放功能时,需设置视频ID、账户ID、(API_KEY或者SdkSidProvider其中一个)及Context(上下文信息)即可播放云端视频。具体实现方式如下:
|
|
|
|
|
|
1. 配置布局文件
|
|
1. 配置布局文件
|
|
|
|
|
... | @@ -208,13 +171,18 @@ public class MainActivity extends AppCompatActivity implements TextureView.Surfa |
... | @@ -208,13 +171,18 @@ public class MainActivity extends AppCompatActivity implements TextureView.Surfa |
|
private Surface surface;
|
|
private Surface surface;
|
|
private DWMediaPlayer player;
|
|
private DWMediaPlayer player;
|
|
private String USERID = "在此配置账户ID";
|
|
private String USERID = "在此配置账户ID";
|
|
private String API_KEY = "在此配置API_KEY";
|
|
|
|
private String videoId = "在此配置视频ID";
|
|
private String videoId = "在此配置视频ID";
|
|
//开通授权验证播放功能的需要配置授权验证码,
|
|
//开通授权验证播放功能的需要配置授权验证码,
|
|
//没有开通授权播放功能的,verificationCode 填null
|
|
//没有开通授权播放功能的,verificationCode 填null
|
|
private String verificationCode = "在此配置视频授权验证码";
|
|
private String verificationCode = "在此配置视频授权验证码";
|
|
|
|
//如果安全校验方式为普通模式需要apikey
|
|
|
|
private String API_KEY = "在此配置API_KEY";
|
|
|
|
//如果安全校验方式为SID需要SdkSidProvider
|
|
|
|
private SdkSidProvider provider = new SdkSidProvider(){
|
|
|
|
public String getVerificationKey(String userId){
|
|
|
|
return 需要返回校验的sid;
|
|
|
|
}
|
|
|
|
}
|
|
@Override
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
super.onCreate(savedInstanceState);
|
... | @@ -226,11 +194,14 @@ public class MainActivity extends AppCompatActivity implements TextureView.Surfa |
... | @@ -226,11 +194,14 @@ public class MainActivity extends AppCompatActivity implements TextureView.Surfa |
|
// 播放DRM加密视频需要这行代码,播放非加密视频不需要
|
|
// 播放DRM加密视频需要这行代码,播放非加密视频不需要
|
|
player.setDRMServerPort(HuodeApplication.getDrmServerPort());
|
|
player.setDRMServerPort(HuodeApplication.getDrmServerPort());
|
|
// 设置视频播放信息
|
|
// 设置视频播放信息
|
|
player.setVideoPlayInfo(videoId, USERID, API_KEY,verificationCode , context);
|
|
//如果是普通的校验方式
|
|
|
|
//player.setVideoPlayInfo(videoId, USERID, API_KEY,verificationCode , context);
|
|
|
|
//如果是sid的校验方式
|
|
|
|
player.setVideoPlayInfo(videoId, USER_ID, verificationCode,context,provider);
|
|
// 重置DRMServer(),播放非加密视频不需要
|
|
// 重置DRMServer(),播放非加密视频不需要
|
|
HuodeApplication.getDRMServer().reset();
|
|
HuodeApplication.getDRMServer().reset();
|
|
mTexture = tv_paly_video.getSurfaceTexture();
|
|
mTexture = tv_paly_video.getSurfaceTexture();
|
|
|
|
player.prepareAsync();
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
... | @@ -319,9 +290,14 @@ SDK视频上传由Uploader类实现,Uploader通过HTTP协议与服务端进行 |
... | @@ -319,9 +290,14 @@ SDK视频上传由Uploader类实现,Uploader通过HTTP协议与服务端进行 |
|
4. 当需要恢复上传时,调用resume()方法,若无网络异常等问题,此时Uploader会重新上传视频文件。
|
|
4. 当需要恢复上传时,调用resume()方法,若无网络异常等问题,此时Uploader会重新上传视频文件。
|
|
5. 当需要取消上作时,调用cancel()方法,此时Uploader会进入等待状态(WAIT)。
|
|
5. 当需要取消上作时,调用cancel()方法,此时Uploader会进入等待状态(WAIT)。
|
|
|
|
|
|
创建Uploader实例需提供VideoInfo(视频信息)和 API_KEY,使用示例如下:
|
|
创建Uploader实例需提供VideoInfo(视频信息)和 API_KEY或者SdkSidProvider,使用示例如下:
|
|
|
|
|
|
```java
|
|
```java
|
|
|
|
SdkSidProvider provider = new SdkSidProvider(){
|
|
|
|
public String getVerificationKey(String userId){
|
|
|
|
return 需要返回校验的sid;
|
|
|
|
}
|
|
|
|
};
|
|
VideoInfo videoInfo = new VideoInfo();
|
|
VideoInfo videoInfo = new VideoInfo();
|
|
videoInfo.setTitle("title");
|
|
videoInfo.setTitle("title");
|
|
videoInfo.setTags("tag");
|
|
videoInfo.setTags("tag");
|
... | @@ -332,7 +308,10 @@ videoInfo.setFilePath("filePath"); |
... | @@ -332,7 +308,10 @@ videoInfo.setFilePath("filePath"); |
|
videoInfo.setUserId("USERID");
|
|
videoInfo.setUserId("USERID");
|
|
// 设置回调信息
|
|
// 设置回调信息
|
|
videoInfo.setNotifyUrl(“NOTIFY_URL");
|
|
videoInfo.setNotifyUrl(“NOTIFY_URL");
|
|
Uploader uploader = new Uploader(videoInfo,"API_KEY");
|
|
//如果是普通校验方式
|
|
|
|
//Uploader uploader = new Uploader(videoInfo,"API_KEY");
|
|
|
|
//如果是SID校验方式
|
|
|
|
Uploader uploader = new Uploader(videoInfo,provider);
|
|
// 开始上传
|
|
// 开始上传
|
|
uploader.start();
|
|
uploader.start();
|
|
```
|
|
```
|
... | @@ -374,6 +353,30 @@ uploader.setUploadListener(uploadListenner); |
... | @@ -374,6 +353,30 @@ uploader.setUploadListener(uploadListenner); |
|
|
|
|
|
SDK视频下载由Downloader类实现的,Downloader通过HTTP协议与服务端进行通信,获取视频下载地址。同时,SDK提供了下载回调接口DownloadListener来监听视频下载流程,如果需要向用户展示下载状态、下载进度等信息,可根据需要进行设置。
|
|
SDK视频下载由Downloader类实现的,Downloader通过HTTP协议与服务端进行通信,获取视频下载地址。同时,SDK提供了下载回调接口DownloadListener来监听视频下载流程,如果需要向用户展示下载状态、下载进度等信息,可根据需要进行设置。
|
|
|
|
|
|
|
|
下载离线加密视频需要实现密钥存储接口。如果只是播放非加密视频,不需要设置
|
|
|
|
|
|
|
|
注意:设置离线加密视频密钥存储接口必须在下载之前设置,建议在应用启动时设置
|
|
|
|
|
|
|
|
```
|
|
|
|
DWSdkStorage myDWSdkStorage = new DWSdkStorage() {
|
|
|
|
private SharedPreferences sp = getApplicationContext().getSharedPreferences("mystorage", MODE_PRIVATE);
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void put(String key, String value) {
|
|
|
|
SharedPreferences.Editor editor = sp.edit();
|
|
|
|
editor.putString(key, value);
|
|
|
|
editor.commit();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String get(String key) {
|
|
|
|
return sp.getString(key, "");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
DWStorageUtil.setDWSdkStorage(myDWSdkStorage);
|
|
|
|
```
|
|
|
|
|
|
### 3.5.1 Downloader使用示例
|
|
### 3.5.1 Downloader使用示例
|
|
|
|
|
|
在使用Downloader前,请先了解Downloader的工作流程:
|
|
在使用Downloader前,请先了解Downloader的工作流程:
|
... | @@ -390,7 +393,10 @@ SDK视频下载由Downloader类实现的,Downloader通过HTTP协议与服务 |
... | @@ -390,7 +393,10 @@ SDK视频下载由Downloader类实现的,Downloader通过HTTP协议与服务 |
|
//提供一个下载路径
|
|
//提供一个下载路径
|
|
String downloadPath = "/storage/emulated/0/HuodeDownload/";
|
|
String downloadPath = "/storage/emulated/0/HuodeDownload/";
|
|
//fileName是文件名,例如“huode”。注意:此文件名不包括后缀名,后缀名会根据云端视频文件格式自动设置。
|
|
//fileName是文件名,例如“huode”。注意:此文件名不包括后缀名,后缀名会根据云端视频文件格式自动设置。
|
|
Downloader downloader = new Downloader(downloadPath,fileName,videoId, "USERID","API_KEY",null);
|
|
//如果是普通安全校验模式
|
|
|
|
//Downloader downloader = new Downloader(downloadPath,fileName,videoId, "USERID","API_KEY",verificationCode);、
|
|
|
|
//如果是sid安全校验模式
|
|
|
|
Downloader downloader = new Downloader(downloadPath,fileName,videoId, "USERID",sdkSidProvider,verificationCode);
|
|
//设置下载重连次数 取值范围(0--100),Demo设置的是重试60次
|
|
//设置下载重连次数 取值范围(0--100),Demo设置的是重试60次
|
|
downloader.setReconnectLimit(ConfigUtil.DOWNLOAD_RECONNECT_LIMIT);
|
|
downloader.setReconnectLimit(ConfigUtil.DOWNLOAD_RECONNECT_LIMIT);
|
|
//设置下载重连间隔,单位ms,demo设置是3000ms
|
|
//设置下载重连间隔,单位ms,demo设置是3000ms
|
... | @@ -507,10 +513,14 @@ Downloader类实现了下载的功能,使用者可以在Downloader的基础上 |
... | @@ -507,10 +513,14 @@ Downloader类实现了下载的功能,使用者可以在Downloader的基础上 |
|
|
|
|
|
初始化VodDownloadManager。
|
|
初始化VodDownloadManager。
|
|
|
|
|
|
```
|
|
```java
|
|
//存储路径downloadPath的格式如"/storage/emulated/0/HuodeDownload/"
|
|
//存储路径downloadPath的格式如"/storage/emulated/0/HuodeDownload/"
|
|
String downloadPath = MultiUtils.createDownloadPath();
|
|
String downloadPath = MultiUtils.createDownloadPath();
|
|
//使用VodDownloadManager需要以单例VodDownloadManager.getInstance()的形式调用VodDownloadManager.getInstance().init(HuodeApplication.getContext(),ConfigUtil.USERID,ConfigUtil.API_KEY,downloadPath);
|
|
//使用VodDownloadManager需要以单例VodDownloadManager.getInstance()的形式调用
|
|
|
|
//如果是使用的普通安全校验方式
|
|
|
|
//VodDownloadManager.getInstance().init(HuodeApplication.getContext(),ConfigUtil.USERID,ConfigUtil.API_KEY,downloadPath);
|
|
|
|
//如果是使用的sid安全校验方式
|
|
|
|
VodDownloadManager.getInstance().init(HuodeApplication.getContext(),ConfigUtil.USERID,sdkSidProvider,downloadPath);
|
|
```
|
|
```
|
|
|
|
|
|
设置下载重试次数,默认为10,可设置区间[0, 100]。
|
|
设置下载重试次数,默认为10,可设置区间[0, 100]。
|
... | | ... | |