|
|
## 3.1 导入SDK
|
|
|
|
|
|
有两种引入SDK的方式,第一种是使用Gradle方式,第二种是引用Jar包。
|
|
|
|
|
|
### 3.1.1 使用Gradle方式
|
|
|
|
|
|
1.在Project的build.gradle文件中配置。
|
|
|
|
|
|
```
|
|
|
allprojects {
|
|
|
repositories {
|
... | ... | @@ -14,13 +18,13 @@ allprojects { |
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
2.在App的build.gradle的文件中添加依赖,注意:在多module的情况下需要传递依赖时将implementation换成api。
|
|
|
|
|
|
```
|
|
|
dependencies {
|
|
|
//获得场景视频SDK,必须引入
|
|
|
implementation 'com.bokecc:CCVOD:3.15.0'
|
|
|
//必须引用commonLib
|
|
|
implementation 'com.bokecc:commonLib:0.1.12'
|
|
|
implementation 'com.bokecc:CCVOD:3.16.0'
|
|
|
//必须引用
|
|
|
implementation 'com.bokecc:drm:1.2.1'
|
|
|
//使用DWIjkMediaPlayer 倍速播放器引入
|
... | ... | @@ -36,9 +40,11 @@ dependencies { |
|
|
|
|
|
}
|
|
|
```
|
|
|
|
|
|
3.在使用投屏功能时还需要做以下配置,不使用投屏不需要配置。
|
|
|
|
|
|
在App的build.gradle的文件中配置:
|
|
|
|
|
|
```
|
|
|
android {
|
|
|
|
... | ... | @@ -51,6 +57,7 @@ android { |
|
|
```
|
|
|
|
|
|
在AndroidManifest.xml中配置:
|
|
|
|
|
|
```
|
|
|
<!--使用投屏功能时需要配置ProjectionUpnpService-->
|
|
|
<service
|
... | ... | @@ -63,6 +70,7 @@ android { |
|
|
```
|
|
|
|
|
|
### 3.1.2 以引用Jar包的方式导入SDK
|
|
|
|
|
|
下载最新版本的SDK,下载地址为:[VOD_Android_SDK](https://hdgit.bokecc.com/ccvideo/VOD_Android_SDK/-/releases),将huodesdk.jar和httplib.jar、drm.jar添加到Android项目中,并配置当前项目可正确的引用类库,使用此方式还需要通过Gradle方式引用implementation 'com.bokecc:commonLib:0.1.12'。
|
|
|
|
|
|
## 3.2 配置项目的网络权限和文件读写权限:
|
... | ... | @@ -163,11 +171,13 @@ public class HuodeApplication extends Application { |
|
|
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"
|
|
|
android:usesCleartextTraffic="true">
|
|
|
```
|
|
|
|
|
|
### 3.3.1 在线播放
|
|
|
|
|
|
使用SDK的在线播放功能时,需设置视频ID、账户ID、API_KEY及Context(上下文信息)即可播放云端视频。具体实现方式如下:
|
|
|
|
|
|
1. 配置布局文件
|
|
|
|
|
|
```
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
... | ... | @@ -183,69 +193,9 @@ public class HuodeApplication extends Application { |
|
|
```
|
|
|
|
|
|
2. 编写播放代码
|
|
|
```
|
|
|
public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener, DWMediaPlayer.OnPreparedListener {
|
|
|
private TextureView tv_paly_video;
|
|
|
private SurfaceTexture mTexture;
|
|
|
private Surface surface;
|
|
|
private DWMediaPlayer player;
|
|
|
private String USERID = "在此配置账户ID";
|
|
|
private String API_KEY = "在此配置API_KEY";
|
|
|
private String videoId = "在此配置视频ID";
|
|
|
//开通授权验证播放功能的需要配置授权验证码,
|
|
|
//没有开通授权播放功能的,verificationCode 填null
|
|
|
private String verificationCode = "在此配置视频授权验证码";
|
|
|
|
|
|
|
|
|
@Override
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
super.onCreate(savedInstanceState);
|
|
|
setContentView(R.layout.activity_main);
|
|
|
tv_paly_video = findViewById(R.id.tv_paly_video);
|
|
|
tv_paly_video.setSurfaceTextureListener(this);
|
|
|
player = new DWMediaPlayer();
|
|
|
Context context = getApplicationContext();
|
|
|
// 播放DRM加密视频需要这行代码,播放非加密视频不需要
|
|
|
player.setDRMServerPort(HuodeApplication.getDrmServerPort());
|
|
|
// 设置视频播放信息
|
|
|
player.setVideoPlayInfo(videoId, USERID, API_KEY,verificationCode , context);
|
|
|
// 重置DRMServer(),播放非加密视频不需要
|
|
|
HuodeApplication.getDRMServer().reset();
|
|
|
mTexture = tv_paly_video.getSurfaceTexture();
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onPrepared(MediaPlayer mediaPlayer) {
|
|
|
if (mediaPlayer != null) {
|
|
|
mediaPlayer.start();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
|
|
|
this.surface = new Surface(surfaceTexture);
|
|
|
player.prepareAsync();
|
|
|
player.setOnPreparedListener(this);
|
|
|
player.setSurface(surface);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
```
|
|
|
public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener, DWMediaPlayer.OnPreparedListener { private TextureView tv_paly_video; private SurfaceTexture mTexture; private Surface surface; private DWMediaPlayer player; private String USERID = "在此配置账户ID"; private String API_KEY = "在此配置API_KEY"; private String videoId = "在此配置视频ID"; //开通授权验证播放功能的需要配置授权验证码, //没有开通授权播放功能的,verificationCode 填null private String verificationCode = "在此配置视频授权验证码"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_paly_video = findViewById(R.id.tv_paly_video); tv_paly_video.setSurfaceTextureListener(this); player = new DWMediaPlayer(); Context context = getApplicationContext(); // 播放DRM加密视频需要这行代码,播放非加密视频不需要 player.setDRMServerPort(HuodeApplication.getDrmServerPort()); // 设置视频播放信息 player.setVideoPlayInfo(videoId, USERID, API_KEY,verificationCode , context); // 重置DRMServer(),播放非加密视频不需要 HuodeApplication.getDRMServer().reset(); mTexture = tv_paly_video.getSurfaceTexture(); } @Override public void onPrepared(MediaPlayer mediaPlayer) { if (mediaPlayer != null) { mediaPlayer.start(); } } @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) { this.surface = new Surface(surfaceTexture); player.prepareAsync(); player.setOnPreparedListener(this); player.setSurface(surface); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { }}
|
|
|
```
|
|
|
|
|
|
当播放器准备播放完成后,调用start()方法开始播放视频。同时,DWMediaPlayer提供了getVideoStatusInfo(获取视频状态),getVideoTitle(获取视频标题)等方法,开发者可根据需要在应用中展示相应的信息。
|
... | ... | @@ -255,13 +205,7 @@ public class MainActivity extends AppCompatActivity implements TextureView.Surfa |
|
|
DWMediaPlayer提供了getDefinitions()方法获取当前播放的视频清晰度列表。如果需要切换视频的清晰度,可根据当前视频的清晰度对DWMediaPlayer进行设置。具体实现方式如下:
|
|
|
|
|
|
```
|
|
|
// 获取清晰度列表
|
|
|
Map<String, Integer> definitions = player.getDefinitions();
|
|
|
// 获取某种清晰度对应的状态码
|
|
|
int definitionCode = definitions.get("definitionInfo");
|
|
|
// 设置播放清晰度
|
|
|
player.setDefaultDefinition(definitionCode);
|
|
|
player.setDefinition(context, definitionCode);
|
|
|
// 获取清晰度列表Map<String, Integer> definitions = player.getDefinitions();// 获取某种清晰度对应的状态码int definitionCode = definitions.get("definitionInfo");// 设置播放清晰度player.setDefaultDefinition(definitionCode);player.setDefinition(context, definitionCode);
|
|
|
```
|
|
|
|
|
|
**设置OnDreamWinErrorListener**
|
... | ... | @@ -269,8 +213,7 @@ player.setDefinition(context, definitionCode); |
|
|
DWMediaPlayer获取播放地址产生的异常需要通过OnDreamWinErrorListener来获取异常,需要用户自行设置该监听。
|
|
|
|
|
|
```
|
|
|
// 设置错误信息监听器
|
|
|
player.setOnDreamWinErrorListener(...)
|
|
|
// 设置错误信息监听器player.setOnDreamWinErrorListener(...)
|
|
|
```
|
|
|
|
|
|
### 3.3.2 本地播放
|
... | ... | @@ -278,18 +221,9 @@ player.setOnDreamWinErrorListener(...) |
|
|
在使用DWMediaPlayer播放本地视频时,使用setOfflineVideoPath设置视频文件地址。具体实现方式如下:
|
|
|
|
|
|
```
|
|
|
String path = "/123456.pcm";
|
|
|
DWMediaPlayer player = new DWMediaPlayer();
|
|
|
|
|
|
// 播放pcm加密视频需要设置此行设置,播放非加密的mp4不需要此行设置
|
|
|
player.setDRMServerPort(HuodeApplication.getDrmServerPort());
|
|
|
//设置视频文件地址
|
|
|
player.setOfflineVideoPath(localVideoPath,context);
|
|
|
// 播放pcm加密视频需要设置此行设置,播放非加密的mp4不需要此行设置
|
|
|
HuodeApplication.getDRMServer().resetLocalPlay();
|
|
|
|
|
|
player.prepareAsync();
|
|
|
String path = "/123456.pcm";DWMediaPlayer player = new DWMediaPlayer();// 播放pcm加密视频需要设置此行设置,播放非加密的mp4不需要此行设置player.setDRMServerPort(HuodeApplication.getDrmServerPort());//设置视频文件地址player.setOfflineVideoPath(localVideoPath,context);// 播放pcm加密视频需要设置此行设置,播放非加密的mp4不需要此行设置HuodeApplication.getDRMServer().resetLocalPlay();player.prepareAsync();
|
|
|
```
|
|
|
|
|
|
当播放器准备完成后,调用start()方法即可开始播放视频。
|
|
|
|
|
|
## 3.4 视频上传
|
... | ... | @@ -309,19 +243,7 @@ SDK视频上传由Uploader类实现,Uploader通过HTTP协议与服务端进行 |
|
|
创建Uploader实例需提供VideoInfo(视频信息)和 API_KEY,使用示例如下:
|
|
|
|
|
|
```
|
|
|
VideoInfo videoInfo = new VideoInfo();
|
|
|
videoInfo.setTitle("title");
|
|
|
videoInfo.setTags("tag");
|
|
|
videoInfo.setDescription("description");
|
|
|
// 设置视频文件地址
|
|
|
videoInfo.setFilePath("filePath");
|
|
|
// 设置账号信息
|
|
|
videoInfo.setUserId("USERID");
|
|
|
// 设置回调信息
|
|
|
videoInfo.setNotifyUrl(“NOTIFY_URL");
|
|
|
Uploader uploader = new Uploader(videoInfo,"API_KEY");
|
|
|
// 开始上传
|
|
|
uploader.start();
|
|
|
VideoInfo videoInfo = new VideoInfo();videoInfo.setTitle("title");videoInfo.setTags("tag");videoInfo.setDescription("description"); // 设置视频文件地址videoInfo.setFilePath("filePath");// 设置账号信息videoInfo.setUserId("USERID");// 设置回调信息videoInfo.setNotifyUrl(“NOTIFY_URL");Uploader uploader = new Uploader(videoInfo,"API_KEY");// 开始上传uploader.start();
|
|
|
```
|
|
|
|
|
|
VideoInfo是用来记录上传过程与视频相关的信息,在初始化视频信息时,服务端需根据视频的标题、标签、描述等来创建视频,所以在使用VideoInfo创建Uploader实例时,请确保视频信息非空。
|
... | ... | @@ -332,29 +254,7 @@ VideoInfo是用来记录上传过程与视频相关的信息,在初始化视 |
|
|
Uploader在执行上传操作时,默认会检查是否设置了UploadListener。若已设置UploadListener,Uploader会回调UploadListener已实现的方法,若未设置,则不回调任何信息。UploadListener具体使用方法如下:
|
|
|
|
|
|
```
|
|
|
UploadListener uploadListener = new UploadListener(){
|
|
|
@Override
|
|
|
public void handleProcess(long range, long size, String videoId) {
|
|
|
// TODO 处理上传进度
|
|
|
}
|
|
|
@Override
|
|
|
public void handleException(DreamwinException exception, int status) {
|
|
|
// TODO 处理上传过程中出现的异常
|
|
|
}
|
|
|
@Override
|
|
|
public void handleStatus(VideoInfo videoInfo, int status) {
|
|
|
// TODO 处理上传回调的视频信息及上传状态,status=100(等待上传)、200(正在上传)、300(暂停上传)、400(上传完成)、500(上传失败)
|
|
|
}
|
|
|
@Override
|
|
|
public void handleCancel(String videoId) {
|
|
|
// TODO 处理取消上传的后续操作
|
|
|
}
|
|
|
@Override
|
|
|
public void onVideoInfoUpdate(VideoInfo videoInfo) {
|
|
|
// TODO 上传信息更新回调,可以在这里保存最新的videoInfo状态
|
|
|
}
|
|
|
};
|
|
|
uploader.setUploadListener(uploadListenner);
|
|
|
UploadListener uploadListener = new UploadListener(){ @Override public void handleProcess(long range, long size, String videoId) { // TODO 处理上传进度 } @Override public void handleException(DreamwinException exception, int status) { // TODO 处理上传过程中出现的异常 } @Override public void handleStatus(VideoInfo videoInfo, int status) { // TODO 处理上传回调的视频信息及上传状态,status=100(等待上传)、200(正在上传)、300(暂停上传)、400(上传完成)、500(上传失败) } @Override public void handleCancel(String videoId) { // TODO 处理取消上传的后续操作 } @Override public void onVideoInfoUpdate(VideoInfo videoInfo) { // TODO 上传信息更新回调,可以在这里保存最新的videoInfo状态 }};uploader.setUploadListener(uploadListenner);
|
|
|
```
|
|
|
|
|
|
## 3.5 视频下载
|
... | ... | @@ -374,27 +274,7 @@ SDK视频下载由Downloader类实现的,Downloader通过HTTP协议与服务 |
|
|
创建Downloader实例需提供视频存储文件,视频ID、账户ID、API_KEY,示例如下:
|
|
|
|
|
|
```
|
|
|
//提供一个下载路径
|
|
|
String downloadPath = "/storage/emulated/0/HuodeDownload/";
|
|
|
//fileName是文件名,例如“huode”。注意:此文件名不包括后缀名,后缀名会根据云端视频文件格式自动设置。
|
|
|
Downloader downloader = new Downloader(downloadPath,fileName,videoId, "USERID","API_KEY",null);
|
|
|
//设置下载重连次数 取值范围(0--100),Demo设置的是重试60次
|
|
|
downloader.setReconnectLimit(ConfigUtil.DOWNLOAD_RECONNECT_LIMIT);
|
|
|
//设置下载重连间隔,单位ms,demo设置是3000ms
|
|
|
downloader.setDownloadRetryPeriod(3 * 1000);
|
|
|
downloader.setDownloadDefinition(downloadInfo.getDefinition());
|
|
|
|
|
|
//下载模式
|
|
|
int downloadMode = downloadInfo.getDownloadMode();
|
|
|
if (downloadMode==0){
|
|
|
downloader.setDownloadMode(MediaMode.VIDEOAUDIO);
|
|
|
}else if (downloadMode==1){
|
|
|
downloader.setDownloadMode(MediaMode.VIDEO);
|
|
|
}else if (downloadMode==2){
|
|
|
downloader.setDownloadMode(MediaMode.AUDIO);
|
|
|
}
|
|
|
// 开始下载
|
|
|
downloader.start();
|
|
|
//提供一个下载路径String downloadPath = "/storage/emulated/0/HuodeDownload/";//fileName是文件名,例如“huode”。注意:此文件名不包括后缀名,后缀名会根据云端视频文件格式自动设置。Downloader downloader = new Downloader(downloadPath,fileName,videoId, "USERID","API_KEY",null); //设置下载重连次数 取值范围(0--100),Demo设置的是重试60次 downloader.setReconnectLimit(ConfigUtil.DOWNLOAD_RECONNECT_LIMIT); //设置下载重连间隔,单位ms,demo设置是3000ms downloader.setDownloadRetryPeriod(3 * 1000); downloader.setDownloadDefinition(downloadInfo.getDefinition()); //下载模式 int downloadMode = downloadInfo.getDownloadMode(); if (downloadMode==0){ downloader.setDownloadMode(MediaMode.VIDEOAUDIO); }else if (downloadMode==1){ downloader.setDownloadMode(MediaMode.VIDEO); }else if (downloadMode==2){ downloader.setDownloadMode(MediaMode.AUDIO); }// 开始下载downloader.start();
|
|
|
```
|
|
|
|
|
|
### 3.5.2 设置下载回调
|
... | ... | @@ -402,34 +282,7 @@ downloader.start(); |
|
|
Downloader在执行下载操作时,默认会检查是否设置了DownloadListener。若已设置DownloadListener,Downloader会回调DownloadListener接口已实现的方法,若未设置,则不回调任何信息。DownloadListener使用方法如下:
|
|
|
|
|
|
```
|
|
|
DownloadListener downloadListener = new DownloadListener(){
|
|
|
@Override
|
|
|
public void handleProcess(long start, long end, String videoId) {
|
|
|
// TODO 处理下载进度
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void handleException(DreamwinException exception, int status) {
|
|
|
// TODO 处理下载过程中发生的异常信息
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void handleStatus(String videoId, int status) {
|
|
|
// TODO 处理视频下载信息及相应状态,status下载状态:100表示等待中,200表示下载中,300表示下载暂停,400表示下载完成
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void handleCancel(String videoId) {
|
|
|
// TODO 处理取消下载的后续操作
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void getFormat(String format) {
|
|
|
//获得文件的格式format
|
|
|
}
|
|
|
};
|
|
|
|
|
|
downloader.setDownloadListener(downloadListener);
|
|
|
DownloadListener downloadListener = new DownloadListener(){ @Override public void handleProcess(long start, long end, String videoId) { // TODO 处理下载进度 } @Override public void handleException(DreamwinException exception, int status) { // TODO 处理下载过程中发生的异常信息 } @Override public void handleStatus(String videoId, int status) { // TODO 处理视频下载信息及相应状态,status下载状态:100表示等待中,200表示下载中,300表示下载暂停,400表示下载完成 } @Override public void handleCancel(String videoId) { // TODO 处理取消下载的后续操作 } @Override public void getFormat(String format) { //获得文件的格式format } };downloader.setDownloadListener(downloadListener);
|
|
|
```
|
|
|
|
|
|
### 3.5.3 选择清晰度下载
|
... | ... | @@ -445,261 +298,180 @@ downloader.setDownloadListener(downloadListener); |
|
|
获取清晰度时需实现OnProcessDefinitionListener接口的onProcessDefinition()方法,并调用Downloader的setOnProcessDefinitionListener()方法设置获取清晰度回调,获取清晰度的示例如下:
|
|
|
|
|
|
```
|
|
|
class DownloadDemo{
|
|
|
private HashMap<Integer, String> dm;
|
|
|
private Downlaoder downloader;
|
|
|
|
|
|
private OnProcessDefinitionListener onProcessDefinitionListener = new OnProcessDefinitionListener(){
|
|
|
@Override
|
|
|
public void onProcessDefinition(HashMap<Integer, String> definitionMap) {
|
|
|
if(definitionMap != null){
|
|
|
dm = definitionMap;
|
|
|
} else {
|
|
|
Log.e("get definition error", "视频清晰度获取失败");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onProcessException(DreamwinException exception) {
|
|
|
Log.i("get definition exception", exception.getErrorCode().Value());
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
private getDefinition(){
|
|
|
downloader.setOnProcessDefinitionListener(onProcessDefinitionListener);
|
|
|
downloader.getDefinitionMap();
|
|
|
}
|
|
|
……
|
|
|
|
|
|
}
|
|
|
class DownloadDemo{ private HashMap<Integer, String> dm; private Downlaoder downloader; private OnProcessDefinitionListener onProcessDefinitionListener = new OnProcessDefinitionListener(){ @Override public void onProcessDefinition(HashMap<Integer, String> definitionMap) { if(definitionMap != null){ dm = definitionMap; } else { Log.e("get definition error", "视频清晰度获取失败"); } } @Override public void onProcessException(DreamwinException exception) { Log.i("get definition exception", exception.getErrorCode().Value()); } }; private getDefinition(){ downloader.setOnProcessDefinitionListener(onProcessDefinitionListener); downloader.getDefinitionMap(); } …… }
|
|
|
```
|
|
|
|
|
|
### 3.5.4 设置下载重试次数
|
|
|
|
|
|
```
|
|
|
//设置下载重试次数,默认为0,可设置区间[0, 100]
|
|
|
setReconnectLimit(int reconnectLimit)
|
|
|
//设置下载重试次数,默认为0,可设置区间[0, 100]setReconnectLimit(int reconnectLimit)
|
|
|
```
|
|
|
|
|
|
### 3.5.5 设置超时时间
|
|
|
|
|
|
```
|
|
|
//设置网络请求的超时时间,区间[5000-30000],单位为ms,默认值为10000ms
|
|
|
setTimeOut(int timeOut)
|
|
|
//设置网络请求的超时时间,区间[5000-30000],单位为ms,默认值为10000mssetTimeOut(int timeOut)
|
|
|
```
|
|
|
|
|
|
### 3.5.6 使用VodDownloadManager管理下载
|
|
|
|
|
|
Downloader类实现了下载的功能,使用者可以在Downloader的基础上自己创建下载管理逻辑,也可以使用SDK提供的下载管理方法,需要注意的是使用VodDownloadManager需要以单例VodDownloadManager.getInstance()的形式调用。
|
|
|
|
|
|
|
|
|
初始化VodDownloadManager。
|
|
|
|
|
|
```
|
|
|
//存储路径downloadPath的格式如"/storage/emulated/0/HuodeDownload/"
|
|
|
String downloadPath = MultiUtils.createDownloadPath();
|
|
|
//使用VodDownloadManager需要以单例VodDownloadManager.getInstance()的形式调用
|
|
|
VodDownloadManager.getInstance().init(HuodeApplication.getContext(),ConfigUtil.USERID,ConfigUtil.API_KEY,downloadPath);
|
|
|
//存储路径downloadPath的格式如"/storage/emulated/0/HuodeDownload/"String downloadPath = MultiUtils.createDownloadPath();//使用VodDownloadManager需要以单例VodDownloadManager.getInstance()的形式调用VodDownloadManager.getInstance().init(HuodeApplication.getContext(),ConfigUtil.USERID,ConfigUtil.API_KEY,downloadPath);
|
|
|
```
|
|
|
|
|
|
设置下载重试次数,默认为10,可设置区间[0, 100]。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().setReconnectLimit(10);
|
|
|
```
|
|
|
|
|
|
设置下载重试间隔,单位ms,默认3000ms。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().setDownloadRetryPeriod(3000);
|
|
|
```
|
|
|
|
|
|
设置是否下载字幕,默认下载,注:视频有字幕资源文件时才会下载。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().setDownloadSubtitle(true);
|
|
|
```
|
|
|
|
|
|
设置同时下载的个数,默认为2,此值不宜设置过大。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().setMaxDownloadingNum(2);
|
|
|
```
|
|
|
|
|
|
下载单个视频,首先要构建一个DownloadConfig实例,DownloadConfig的字段信息如下。
|
|
|
|
|
|
```
|
|
|
private String videoId;//视频ID,不可为空
|
|
|
private String veriCode;//视频授权码,没有可不填
|
|
|
private String fileName;//要保存的文件名,不可为空,同一个视频不同清晰度的文件名要不同(可以拼上清晰度字段或自定义的方式来区分)
|
|
|
private int downloadMode;//下载模式,0:音视频模式 1:下载视频 2:下载音频
|
|
|
private int definition;//清晰度
|
|
|
private String videoCover;//传入的视频封面,可为null,若此处为null,后续的返回的VodDownloadBean此值也为null
|
|
|
private String videoId;//视频ID,不可为空private String veriCode;//视频授权码,没有可不填private String fileName;//要保存的文件名,不可为空,同一个视频不同清晰度的文件名要不同(可以拼上清晰度字段或自定义的方式来区分)private int downloadMode;//下载模式,0:音视频模式 1:下载视频 2:下载音频private int definition;//清晰度private String videoCover;//传入的视频封面,可为null,若此处为null,后续的返回的VodDownloadBean此值也为null
|
|
|
```
|
|
|
|
|
|
调用VodDownloadManager.getInstance().insertDownload(downloadConfig)插入下载任务。
|
|
|
|
|
|
```
|
|
|
DownloadConfig downloadConfig = new DownloadConfig(videoId, verificationCode, dowloadTitle, downloadMode, currentDefinition, videoCover);
|
|
|
VodDownloadManager.getInstance().insertDownload(downloadConfig);
|
|
|
DownloadConfig downloadConfig = new DownloadConfig(videoId, verificationCode, dowloadTitle, downloadMode, currentDefinition, videoCover);VodDownloadManager.getInstance().insertDownload(downloadConfig);
|
|
|
```
|
|
|
|
|
|
下载多个视频,调用VodDownloadManager.getInstance().insertBatchDownload(downloadConfigs)。
|
|
|
|
|
|
```
|
|
|
ArrayList<DownloadConfig> downloadConfigs = new ArrayList<>();
|
|
|
downloadConfigs.add(downloadConfig1);
|
|
|
downloadConfigs.add(downloadConfig2);
|
|
|
downloadConfigs.add(downloadConfig3);
|
|
|
VodDownloadManager.getInstance().insertBatchDownload(downloadConfigs);
|
|
|
ArrayList<DownloadConfig> downloadConfigs = new ArrayList<>();downloadConfigs.add(downloadConfig1);downloadConfigs.add(downloadConfig2);downloadConfigs.add(downloadConfig3);VodDownloadManager.getInstance().insertBatchDownload(downloadConfigs);
|
|
|
```
|
|
|
|
|
|
开启一个定时器,调用VodDownloadManager.getInstance().update(),启动和刷新下载任务,定时器的间隔为1000ms,不要修改为别的数值。
|
|
|
```
|
|
|
|
|
|
timer.schedule(new TimerTask() {
|
|
|
@Override
|
|
|
public void run() {
|
|
|
VodDownloadManager.getInstance().update();
|
|
|
}
|
|
|
}, 1 * 1000, 1 * 1000);
|
|
|
```
|
|
|
timer.schedule(new TimerTask() { @Override public void run() { VodDownloadManager.getInstance().update(); }}, 1 * 1000, 1 * 1000);
|
|
|
```
|
|
|
|
|
|
刷新下载进度。
|
|
|
```
|
|
|
VodDownloadManager.getInstance().setOnUpdateDownload(new VodDownloadManager.OnUpdateDownload() {
|
|
|
@Override
|
|
|
public void updateDownload() {
|
|
|
//在主线程刷新UI
|
|
|
activity.runOnUiThread(new Runnable() {
|
|
|
@Override
|
|
|
public void run() {
|
|
|
initAllPause();
|
|
|
updateListView();
|
|
|
}
|
|
|
});
|
|
|
|
|
|
}
|
|
|
});
|
|
|
```
|
|
|
VodDownloadManager.getInstance().setOnUpdateDownload(new VodDownloadManager.OnUpdateDownload() { @Override public void updateDownload() { //在主线程刷新UI activity.runOnUiThread(new Runnable() { @Override public void run() { initAllPause(); updateListView(); } }); }});
|
|
|
```
|
|
|
|
|
|
|
|
|
监听有新的文件下载完成,会返回vodDownloadBean实例。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().setOnDownloadFinishListener(new VodDownloadManager.OnDownloadFinishListener() {
|
|
|
@Override
|
|
|
public void onDownloadFinish(VodDownloadBean vodDownloadBean) {
|
|
|
//vodDownloadBean包含下载文件的信息,根据需要自行处理
|
|
|
}
|
|
|
});
|
|
|
VodDownloadManager.getInstance().setOnDownloadFinishListener(new VodDownloadManager.OnDownloadFinishListener() { @Override public void onDownloadFinish(VodDownloadBean vodDownloadBean) { //vodDownloadBean包含下载文件的信息,根据需要自行处理 }});
|
|
|
```
|
|
|
|
|
|
|
|
|
VodDownloadBean各字段的信息如下,部分字段的值可能为空或0。
|
|
|
|
|
|
```
|
|
|
private String videoId;//视频ID
|
|
|
private String fileName;//文件名
|
|
|
private String format;//文件格式
|
|
|
private String veriCode;//视频授权码
|
|
|
private int downloadMode;//下载模式,0:音视频模式 1:下载视频 2:下载音频
|
|
|
private String videoCover;//视频封面,和创建下载任务时传入的封面相同
|
|
|
private long start;//断点续传的开始位置
|
|
|
private long end;//文件的总大小
|
|
|
private int status;//下载状态,100表示等待中,200表示下载中,300表示下载暂停,400表示下载完成
|
|
|
private int definition;//清晰度
|
|
|
private String videoPath;//文件的保存路径
|
|
|
private int subtitleNum;//字幕数量
|
|
|
private int firstSubtitleStatus;//第一种字幕的下载状态,1:成功,2:失败
|
|
|
private String firstSubtitlePath;//第一种字幕的保存路径
|
|
|
private String firstSubtitleUrl;//第一种字幕文件地址,仅在下载字幕失败时有值
|
|
|
private int secondSubtitleStatus;//第二种字幕的下载状态,1:成功,2:失败
|
|
|
private String secondSubtitlePath;//第二种字幕的保存路径
|
|
|
private String secondSubtitleUrl;//第二种字幕文件地址,仅在下载字幕失败时有值
|
|
|
private int saveSubtitleSetStatus;//保存字幕设置状态,1:成功,2:失败
|
|
|
private String saveSubtitleSetPath;//字幕设置的保存路径
|
|
|
private String subtitleSetInfo;//字幕设置信息,仅在保存字幕设置失败时有值
|
|
|
private int errorCode;//下载错误码
|
|
|
private String errorMsg;//下载错误信息
|
|
|
private String videoId;//视频IDprivate String fileName;//文件名private String format;//文件格式private String veriCode;//视频授权码private int downloadMode;//下载模式,0:音视频模式 1:下载视频 2:下载音频private String videoCover;//视频封面,和创建下载任务时传入的封面相同private long start;//断点续传的开始位置private long end;//文件的总大小private int status;//下载状态,100表示等待中,200表示下载中,300表示下载暂停,400表示下载完成private int definition;//清晰度private String videoPath;//文件的保存路径private int subtitleNum;//字幕数量private int firstSubtitleStatus;//第一种字幕的下载状态,1:成功,2:失败private String firstSubtitlePath;//第一种字幕的保存路径private String firstSubtitleUrl;//第一种字幕文件地址,仅在下载字幕失败时有值private int secondSubtitleStatus;//第二种字幕的下载状态,1:成功,2:失败private String secondSubtitlePath;//第二种字幕的保存路径private String secondSubtitleUrl;//第二种字幕文件地址,仅在下载字幕失败时有值private int saveSubtitleSetStatus;//保存字幕设置状态,1:成功,2:失败private String saveSubtitleSetPath;//字幕设置的保存路径private String subtitleSetInfo;//字幕设置信息,仅在保存字幕设置失败时有值private int errorCode;//下载错误码private String errorMsg;//下载错误信息
|
|
|
```
|
|
|
|
|
|
|
|
|
删除下载任务。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().deleteDownloadInfo(downloadOperator);
|
|
|
```
|
|
|
|
|
|
|
|
|
暂停下载。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().pauseDownload(downloadOperator);
|
|
|
```
|
|
|
|
|
|
由暂停状态恢复下载。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().resumeDownload(downloadOperator);
|
|
|
```
|
|
|
|
|
|
恢复或暂停下载切换。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().resumeOrPauseDownload(downloadOperator);
|
|
|
```
|
|
|
|
|
|
暂停全部下载。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().pauseAllDownload();
|
|
|
```
|
|
|
|
|
|
恢复全部下载。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().resumeAllDownload();
|
|
|
```
|
|
|
|
|
|
判断当前文件是否已经在下载队列中。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().isExistDownloadInfo(fileName);
|
|
|
```
|
|
|
|
|
|
获取下载中的个数。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().getDownloadingCount();
|
|
|
```
|
|
|
|
|
|
获得暂停和等待中状态下的个数。
|
|
|
|
|
|
```
|
|
|
VodDownloadManager.getInstance().getPauseAndWaitCount();
|
|
|
```
|
|
|
|
|
|
### 3.5.7 批量获取下载地址
|
|
|
|
|
|
批量最多获取10个视频的下载地址,超过10个的则只返回前10个视频的下载信息。
|
|
|
```
|
|
|
DownloaderHelper downloaderHelper = new DownloaderHelper("USERID","API_KEY");
|
|
|
List<DownloadModel> downloadModels = new ArrayList<>();
|
|
|
DownloadModel downloadModel1 = new DownloadModel("videoId1","授权码,没有的留空");
|
|
|
DownloadModel downloadModel2 = new DownloadModel("videoId2","授权码,没有的留空");
|
|
|
downloadModels.add(downloadModel1);
|
|
|
downloadModels.add(downloadModel2);
|
|
|
downloaderHelper.getDownloadInfos(downloadModels, new OnDownloadInfoListener() {
|
|
|
@Override
|
|
|
public void onDownloadInfo(List<DownloadInfo> downloadInfos) {
|
|
|
//在这里获得下载信息,当前处于子线程,不可直接进行UI操作
|
|
|
}
|
|
|
});
|
|
|
|
|
|
```
|
|
|
DownloaderHelper downloaderHelper = new DownloaderHelper("USERID","API_KEY");List<DownloadModel> downloadModels = new ArrayList<>();DownloadModel downloadModel1 = new DownloadModel("videoId1","授权码,没有的留空");DownloadModel downloadModel2 = new DownloadModel("videoId2","授权码,没有的留空");downloadModels.add(downloadModel1);downloadModels.add(downloadModel2);downloaderHelper.getDownloadInfos(downloadModels, new OnDownloadInfoListener() { @Override public void onDownloadInfo(List<DownloadInfo> downloadInfos) { //在这里获得下载信息,当前处于子线程,不可直接进行UI操作 }});
|
|
|
```
|
|
|
|
|
|
DownloadInfo的字段信息。
|
|
|
|
|
|
```
|
|
|
private String videoId;//视频ID
|
|
|
private boolean isSuccess;//获取视频下载信息是否成功,为true的时候才有之后的视频信息,为false表示失败
|
|
|
private String title;//视频标题
|
|
|
private String statusinfo;//视频状态
|
|
|
private int defaultquality;//默认清晰度
|
|
|
private ArrayList<DownloadQuality> qualities;//清晰度和地址信息
|
|
|
private String videoId;//视频IDprivate boolean isSuccess;//获取视频下载信息是否成功,为true的时候才有之后的视频信息,为false表示失败private String title;//视频标题private String statusinfo;//视频状态private int defaultquality;//默认清晰度private ArrayList<DownloadQuality> qualities;//清晰度和地址信息
|
|
|
```
|
|
|
|
|
|
DownloadQuality的字段信息。
|
|
|
|
|
|
```
|
|
|
private int quality;//清晰度标识
|
|
|
private int mediatype;//媒体文件类型,1视频,2音频
|
|
|
private String desp;//清晰度文字描述
|
|
|
private ArrayList<DownloadCopy> copies;//文件地址和优先级信息
|
|
|
private int quality;//清晰度标识private int mediatype;//媒体文件类型,1视频,2音频private String desp;//清晰度文字描述private ArrayList<DownloadCopy> copies;//文件地址和优先级信息
|
|
|
```
|
|
|
|
|
|
DownloadCopy的字段信息。
|
|
|
|
|
|
```
|
|
|
private String url;//下载地址
|
|
|
private int priority;//优先级,数字越大,优先级越高
|
|
|
private String url;//下载地址private int priority;//优先级,数字越大,优先级越高
|
|
|
```
|
|
|
|
|
|
|
... | ... | @@ -712,17 +484,13 @@ SDK音频播放由DWMediaPlayer类实现,DWMediaPlayer继承了Android的媒 |
|
|
目前播放器默认支持的为视频播放,想要进行音频播放,在prepareAsync()之前则需要如下设置:
|
|
|
|
|
|
```
|
|
|
player.setDefaultPlayMode(MediaMode.AUDIO, onPlayModeListener);
|
|
|
player.setAudioPlay(true);
|
|
|
player.prepareAsync();
|
|
|
player.setDefaultPlayMode(MediaMode.AUDIO, onPlayModeListener);player.setAudioPlay(true);player.prepareAsync();
|
|
|
```
|
|
|
|
|
|
如果默认设置的为支持音视频模式,那么从视频切换到音频的方法为如下:
|
|
|
|
|
|
```
|
|
|
player.reset();
|
|
|
player.setAudioPlay(true)
|
|
|
player.prepareAsync();
|
|
|
player.reset();player.setAudioPlay(true)player.prepareAsync();
|
|
|
```
|
|
|
|
|
|
注:onPlayModeListener的回调返回该视频节点信息支持的播放模式。如果没有节点信息,onPlayModeListener的回调返回为null。
|
... | ... | |