|
## 3.1 导入SDK
|
|
## 4.1 广告功能
|
|
有两种引入SDK的方式,第一种是使用Gradle方式,第二种是引用Jar包。
|
|
|
|
### 3.1.1 使用Gradle方式
|
|
|
|
1.在Project的build.gradle文件中配置。
|
|
|
|
```
|
|
|
|
allprojects {
|
|
|
|
repositories {
|
|
|
|
google()
|
|
|
|
jcenter()
|
|
|
|
//必须配置
|
|
|
|
maven {url 'https://dl.bintray.com/bokecc/maven'}
|
|
|
|
//使用投屏功能时添加此配置,不使用不需要
|
|
|
|
maven { url 'http://4thline.org/m2'}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
2.在App的build.gradle的文件中添加依赖,注意:在多module的情况下需要传递依赖时将implementation换成api。
|
|
|
|
```
|
|
|
|
dependencies {
|
|
|
|
//获得场景视频SDK,必须引入
|
|
|
|
implementation 'com.bokecc:vod:3.5.0'
|
|
|
|
//播放加密视频必须引用http和drmv6
|
|
|
|
implementation 'com.bokecc:http:1.2.0'
|
|
|
|
implementation 'com.bokecc:drmv6:2.19.0'
|
|
|
|
//使用DWIjkMediaPlayer 倍速播放器引入
|
|
|
|
implementation 'com.bokecc:speedplay:2.19.3'
|
|
|
|
//上传视频时使用压缩功能时需要引用
|
|
|
|
implementation 'com.bokecc:compressvideo:1.0.0'
|
|
|
|
//使用Vr播放功能时需要引入
|
|
|
|
implementation 'com.bokecc:vrplay:1.0.0'
|
|
|
|
//使用投屏功能需要引用
|
|
|
|
implementation 'com.bokecc:projection:1.7.0'
|
|
|
|
|
|
|
|
}
|
|
1. 本功能需要后台开通移动广告;
|
|
```
|
|
2. 广告核心类DWMediaAD提供能了获取广告信息的方法,广告详细信息通过DWMediaADListener监听器回调来获取;
|
|
3.在使用投屏功能时还需要做以下配置,不使用投屏不需要配置。
|
|
3. 广告分为前贴和暂停,需要分别调用方法来获取。其中前贴目前提供了视频和图片广告,暂停只有图片广告。
|
|
|
|
|
|
在App的build.gradle的文件中配置:
|
|
|
|
```
|
|
```
|
|
android {
|
|
……
|
|
|
|
DWMediaAD mDWMediaAD = new DWMediaAD(dwMediaADlistener, USERID, videoId);
|
|
//使用投屏功能时需要添加此配置
|
|
mDWMediaAD.getFrontAD();
|
|
packagingOptions {
|
|
mDWMediaAD.getPauseAD();
|
|
exclude 'META-INF/LICENSE.txt'
|
|
……
|
|
exclude 'META-INF/beans.xml'
|
|
// 广告监听器
|
|
|
|
private DWMediaADListener dwMediaADlistener = new DWMediaADListener({
|
|
|
|
//回调暂停广告信息
|
|
|
|
@Override
|
|
|
|
public void onPauseAD(PauseADInfo info) {
|
|
|
|
……
|
|
}
|
|
}
|
|
}
|
|
//回调片头广告信息
|
|
|
|
@Override
|
|
|
|
public void onFrontAD(FrontADInfo info) {
|
|
|
|
……
|
|
|
|
}
|
|
|
|
@Override
|
|
|
|
public void onFrontADError(DreamwinException e) {
|
|
|
|
……
|
|
|
|
}
|
|
|
|
@Override
|
|
|
|
public void onPauseADError(DreamwinException e) {
|
|
|
|
}
|
|
|
|
};
|
|
```
|
|
```
|
|
|
|
|
|
在AndroidManifest.xml中配置:
|
|
注:目前只提供获取广告信息的接口,广告界面需要用户自行实现
|
|
```
|
|
|
|
<!--使用投屏功能时需要配置ProjectionUpnpService-->
|
|
|
|
<service
|
|
|
|
android:name="com.bokecc.projection.ProjectionUpnpService"
|
|
|
|
android:exported="false" />
|
|
|
|
<!--使用投屏功能时需要配置ProjectionSystemService-->
|
|
|
|
<service
|
|
|
|
android:name="com.bokecc.projection.ProjectionSystemService"
|
|
|
|
android:exported="false" />
|
|
|
|
```
|
|
|
|
|
|
|
|
### 3.1.2 以引用Jar包的方式导入SDK
|
|
## 4.2 用户自定义参数播放统计功能
|
|
下载最新版本的SDK,下载地址为:[CCVideo/VOD_Android_SDK](https://github.com/CCVideo/VOD_Android_SDK),将huodesdk.jar和httplib.jar添加到Android项目中,并配置当前项目可正确的引用类库。
|
|
|
|
|
|
|
|
## 3.2 配置项目的网络权限和文件读写权限:
|
|
支持用户自定义参数实现播放的统计,可以通过调用player的setCustomId(String customId)方法来实现,其中customId为用户自己定义的参数值。
|
|
|
|
|
|
```
|
|
```
|
|
<!-- 用于网络通信 -->
|
|
//设置CustomId
|
|
<uses-permission android:name="android.permission.INTERNET" />
|
|
player.setCustomId("Huode");
|
|
<!-- 用于存储已下载文件 -->
|
|
|
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
|
|
|
```
|
|
```
|
|
|
|
|
|
## 3.3 视频播放
|
|
注:需要在prepareAsync()方法前调用才可以生效。
|
|
|
|
|
|
SDK视频播放由DWMediaPlayer类实现,使用DWMediaPlayer既可播放获得场景视频云服务平台下的视频(以下简称在线播放),也可播放本地视频。播放加密视频需要启动DRMServer,启动DRMServer后可以播放加密视频和非加密视频,若只是播放非加密视频不需要启动DRMServer。
|
|
|
|
|
|
|
|
在自定义的HuodeApplication(这个类名可以自定义)启动DRMServer:
|
|
## 4.3 视频打点功能
|
|
|
|
|
|
```
|
|
支持用户自定义视频打点功能的回调,可以通过调用player的setOnHotspotListener(OnHotspotListener onHotspotListener)方法,当视频有打点信息时,在该接口中回调打点信息。
|
|
public class HuodeApplication extends Application {
|
|
|
|
|
|
|
|
private static DRMServer drmServer;
|
|
```
|
|
private static int drmServerPort;
|
|
//获得视频打点信息
|
|
|
|
player.setOnHotspotListener(new OnHotspotListener() {
|
|
|
|
/**
|
|
|
|
* @param hotspotMap key为时间(秒),value是打点描述
|
|
|
|
*/
|
|
@Override
|
|
@Override
|
|
public void onCreate() {
|
|
public void onHotspots(TreeMap<Integer, String> hotspotMap) {
|
|
super.onCreate();
|
|
|
|
initDWStorage();
|
|
|
|
startDRMServer();
|
|
|
|
}
|
|
|
|
|
|
|
|
// 启动DRMServer
|
|
|
|
public void startDRMServer() {
|
|
|
|
if (drmServer == null) {
|
|
|
|
drmServer = new DRMServer();
|
|
|
|
drmServer.setRequestRetryCount(20);
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
drmServer.start();
|
|
|
|
setDrmServerPort(drmServer.getPort());
|
|
|
|
} catch (Exception e) {
|
|
|
|
Toast.makeText(getApplicationContext(), "启动解密服务失败,请检查网络限制情况:"+e.getMessage(), Toast.LENGTH_LONG).show();
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
//播放加密视频调用此方法
|
|
});
|
|
private void initDWStorage() {
|
|
```
|
|
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
|
|
## 4.4 视频问答功能
|
|
public String get(String key) {
|
|
|
|
return sp.getString(key, "");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
DWStorageUtil.setDWSdkStorage(myDWSdkStorage);
|
|
支持用户自定义视频问答功能的回调,可以通过调用player的setOnQAMsgListener(OnQAMsgListener qaMsgListener)方法,当视频有问答信息时,在该接口中回调问答信息。
|
|
}
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
//获得视频问答信息
|
|
|
|
player.setOnQAMsgListener(new OnQAMsgListener() {
|
|
|
|
/**
|
|
|
|
* @param qaJsonArray,单条信息包含有question和answer
|
|
|
|
*/
|
|
@Override
|
|
@Override
|
|
public void onTerminate() {
|
|
public void onQAMessage(JSONArray qaJsonArray) {
|
|
if (drmServer != null) {
|
|
|
|
drmServer.stop();
|
|
|
|
}
|
|
|
|
super.onTerminate();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int getDrmServerPort() {
|
|
|
|
return drmServerPort;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setDrmServerPort(int drmServerPort) {
|
|
|
|
this.drmServerPort = drmServerPort;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static DRMServer getDRMServer() {
|
|
|
|
return drmServer;
|
|
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
|
|
问答信息回调的格式为JSONArray,单条问答信息的内容如下,请用户自行解析。
|
|
|
|
|
|
|
|
```
|
|
|
|
{
|
|
|
|
"answers": [
|
|
|
|
{
|
|
|
|
"content": "A、答案A",
|
|
|
|
"id": 1045,
|
|
|
|
"right": false
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"content": "B、答案B",
|
|
|
|
"id": 1046,
|
|
|
|
"right": true
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"content": "C、答案C",
|
|
|
|
"id": 1047,
|
|
|
|
"right": false
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"content": "D、答案D",
|
|
|
|
"id": 1048,
|
|
|
|
"right": false
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"backSecond": -1,
|
|
|
|
"keepPlay":true,
|
|
|
|
"content": "内容",
|
|
|
|
"explainInfo": "解释答案",
|
|
|
|
"id": 99,
|
|
|
|
"jump": false,
|
|
|
|
"showTime": 2
|
|
}
|
|
}
|
|
|
|
|
|
```
|
|
```
|
|
|
|
|
|
在AndroidManifest.xml文件中配置自定义的HuodeApplication:
|
|
## 4.5 视频显示字幕功能
|
|
|
|
|
|
```
|
|
支持从服务器获取字幕资源并显示,可以通过调用player的setOnSubtitleMsgListener(OnSubtitleMsgListener onSubtitleMsgListener)方法,当有字幕资源时,在该接口中回调字幕信息。
|
|
<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 在线播放
|
|
|
|
|
|
|
|
使用SDK的在线播放功能时,需设置视频ID、账户ID、API_KEY及Context(上下文信息)即可播放云端视频。具体实现方式如下:
|
|
|
|
|
|
|
|
1. 配置布局文件
|
|
|
|
```
|
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
|
|
android:layout_width="match_parent"
|
|
|
|
android:layout_height="match_parent">
|
|
|
|
|
|
|
|
<TextureView
|
|
|
|
android:id="@+id/tv_paly_video"
|
|
|
|
android:layout_width="match_parent"
|
|
|
|
android:layout_height="200dp" />
|
|
|
|
|
|
|
|
</LinearLayout>
|
|
|
|
```
|
|
|
|
|
|
|
|
2. 编写播放代码
|
|
|
|
```
|
|
```
|
|
public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener, DWMediaPlayer.OnPreparedListener {
|
|
//获得字幕信息
|
|
private TextureView tv_paly_video;
|
|
player.setOnSubtitleMsgListener(new OnSubtitleMsgListener() {
|
|
private SurfaceTexture mTexture;
|
|
/**
|
|
private Surface surface;
|
|
* 第一种字幕,设置这些字幕样式需要在主线程操作
|
|
private DWMediaPlayer player;
|
|
* @param subtitleName 字幕名称
|
|
private String USERID = "在此配置账户ID";
|
|
* @param sort 字幕位置顺序
|
|
private String API_KEY = "在此配置API_KEY";
|
|
* @param url 字幕资源地址
|
|
private String videoId = "在此配置视频ID";
|
|
* @param font 字体名称,需要在工程的assets(没有请自行创建)
|
|
//开通授权验证播放功能的需要配置授权验证码,
|
|
* 文件夹下有对应的字体文件,自行实现字体显示逻辑
|
|
//没有开通授权播放功能的,verificationCode 填null
|
|
* @param size 字体大小
|
|
private String verificationCode = "在此配置视频授权验证码";
|
|
* @param color 字体颜色
|
|
|
|
* @param surroundColor 字体环绕色
|
|
|
|
* @param bottom 距离底部的边距占手机屏幕宽度的百分比
|
|
|
|
* @param code 字幕编码格式,如utf-8
|
|
|
|
*/
|
|
@Override
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
public void onSubtitleMsg(String subtitleName, int sort, String url, String font, int size, String color, String surroundColor, double bottom, String code) {
|
|
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();
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 第二种字幕,设置这些字幕样式需要在主线程操作
|
|
|
|
* @param subtitleName 字幕名称
|
|
|
|
* @param sort 字幕位置顺序
|
|
|
|
* @param url 字幕资源地址
|
|
|
|
* @param font 字体名称,需要在工程的assets(没有请自行创建)
|
|
|
|
* 文件夹下有对应的字体文件,自行实现字体显示逻辑
|
|
|
|
* @param size 字体大小
|
|
|
|
* @param color 字体颜色
|
|
|
|
* @param surroundColor 字体环绕色
|
|
|
|
* @param bottom 距离底部的边距占手机屏幕宽度的百分比
|
|
|
|
* @param code 字幕编码格式,如utf-8
|
|
|
|
*/
|
|
@Override
|
|
@Override
|
|
public void onPrepared(MediaPlayer mediaPlayer) {
|
|
public void onSecSubtitleMsg(String subtitleName, int sort, String url, String font, int size, String color, String surroundColor, double bottom, String code) {
|
|
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);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param defaultSubtitle 0默认显示第一种字幕,1默认显示第二种字幕,2默认显示双语字幕
|
|
|
|
*/
|
|
@Override
|
|
@Override
|
|
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {
|
|
public void onDefSubtitle(int defaultSubtitle) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
@Override
|
|
## 4.6 访客信息收集功能
|
|
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
|
|
|
|
return false;
|
|
支持从服务器获取访客信息收集设置并显示,可以通过调用player的setOnVisitMsgListener(OnVisitMsgListener onVisitMsgListener)方法,得到访客信息收集设置。
|
|
}
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
//获得访客信息设置
|
|
|
|
player.setOnVisitMsgListener(new OnVisitMsgListener() {
|
|
|
|
/**
|
|
|
|
* @param appearTime 收集器出现的时间(S)
|
|
|
|
* @param imageURL 图片地址
|
|
|
|
* @param isJump 是否需要跳过 1跳过,0不跳过
|
|
|
|
* @param jumpURL 图片跳转的地址
|
|
|
|
* @param title 收集器名称
|
|
|
|
* @param visitorId 收集器ID
|
|
|
|
* @param visitorMessage //要收集的信息
|
|
|
|
*/
|
|
@Override
|
|
@Override
|
|
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
|
|
public void onVisitMsg(int appearTime, String imageURL, int isJump, String jumpURL, String title, String visitorId, JSONArray visitorMessage) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
```
|
|
```
|
|
|
|
|
|
当播放器准备播放完成后,调用start()方法开始播放视频。同时,DWMediaPlayer提供了getVideoStatusInfo(获取视频状态),getVideoTitle(获取视频标题)等方法,开发者可根据需要在应用中展示相应的信息。
|
|
|
|
|
|
|
|
**选择清晰度播放**
|
|
## 4.7 倍速功能
|
|
|
|
|
|
|
|
倍速功能使用第三方库IjkMediaPlayer v0.8.4来实现。倍速播放功能需要使用DWIjkMediaPlayer类,该类继承自第三方库IjkMediaPlayer的IjkMediaPlayer类,该类的使用方法和DWMediaPlayer一样。
|
|
|
|
|
|
DWMediaPlayer提供了getDefinitions()方法获取当前播放的视频清晰度列表。如果需要切换视频的清晰度,可根据当前视频的清晰度对DWMediaPlayer进行设置。具体实现方式如下:
|
|
IjkMeidaPlayer的github地址如下:请参考链接:https://github.com/Bilibili/ijkplayer
|
|
|
|
|
|
|
|
设置倍速方法如下:
|
|
|
|
|
|
```
|
|
```
|
|
// 获取清晰度列表
|
|
player.setSpeed();
|
|
Map<String, Integer> definitions = player.getDefinitions();
|
|
|
|
// 获取某种清晰度对应的状态码
|
|
|
|
int definitionCode = definitions.get("definitionInfo");
|
|
|
|
// 设置播放清晰度
|
|
|
|
player.setDefaultDefinition(definitionCode);
|
|
|
|
player.setDefinition(context, definitionCode);
|
|
|
|
```
|
|
```
|
|
|
|
|
|
**设置OnDreamWinErrorListener**
|
|
**ijkspeed文件夹为ijk所需要的so文件和jar,请放到自己的工程目录使用。**
|
|
|
|
|
|
|
|
## 4.8 辅助调试工具
|
|
|
|
|
|
DWMediaPlayer获取播放地址产生的异常需要通过OnDreamWinErrorListener来获取异常,需要用户自行设置该监听。
|
|
SDK提供HTTP通信日志调试功能。在使用SDK进行播放、上传、下载过程中,如果遇到与网络通信相关的问题,可通过设置HTTP日志的级别获取通信信息。使用示例如下:
|
|
|
|
|
|
```
|
|
```
|
|
// 设置错误信息监听器
|
|
// 设置HTTP通信日志级别
|
|
player.setOnDreamWinErrorListener(...)
|
|
HttpUtil.LOG_LEVEL = HttpLogLevel.DETAIL;
|
|
```
|
|
```
|
|
|
|
|
|
### 3.3.2 本地播放
|
|
默认日志级别为GENERAL(记录HTTP通信发生时间、响应状态码)。
|
|
|
|
|
|
|
|
## 4.9 问答统计功能
|
|
|
|
|
|
在使用DWMediaPlayer播放本地视频时,使用setOfflineVideoPath设置视频文件地址。具体实现方式如下:
|
|
要统计问答的结果,只需在提交答案时调用下面这个方法:
|
|
|
|
|
|
```
|
|
```
|
|
String path = "/123456.pcm";
|
|
/**
|
|
DWMediaPlayer player = new DWMediaPlayer();
|
|
* @param vid 加密的视频ID
|
|
|
|
* @param qid 问题ID
|
|
|
|
* @param answer 用户选择的选项ID,以逗号分隔多个选项ID。如1345是单选;2067,3092,4789是多选。
|
|
|
|
* @param status 用户答题的结果。1=正确;0=错误。
|
|
|
|
*/
|
|
|
|
QaStatistics.reportQaResult(String vid, String qid, String answer, String status);
|
|
|
|
```
|
|
|
|
## 4.10 授权验证功能
|
|
|
|
从服务器获取授权验证信息,可以通过调用player的setOnAuthMsgListener(OnAuthMsgListener onAuthMsgListener)方法,在该接口中回调授权验证信息。
|
|
|
|
```
|
|
|
|
//获得授权验证信息
|
|
|
|
player.setOnAuthMsgListener(new OnAuthMsgListener() {
|
|
|
|
/**
|
|
|
|
* @param enable 视频是否可以完整播放 0:不允许完整播放 1:允许完整播放
|
|
|
|
* @param freetime 视频试看时间,单位:秒
|
|
|
|
* @param messaage 不允许播放,或者试看结束时播放器显示的提示内容
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public void onAuthMsg(int enable, int freetime, String messaage) {
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
|
|
## 4.11 视频压缩功能
|
|
|
|
|
|
// 播放pcm加密视频需要设置此行设置,播放非加密的mp4不需要此行设置
|
|
可以选择高质量压缩、中质量压缩、低质量压缩,压缩质量越高,压缩出来的文件就相对较大。
|
|
player.setDRMServerPort(HuodeApplication.getDrmServerPort());
|
|
|
|
//设置视频文件地址
|
|
|
|
player.setOfflineVideoPath(localVideoPath,context);
|
|
|
|
// 播放pcm加密视频需要设置此行设置,播放非加密的mp4不需要此行设置
|
|
|
|
HuodeApplication.getDRMServer().resetLocalPlay();
|
|
|
|
|
|
|
|
player.prepareAsync();
|
|
|
|
```
|
|
```
|
|
当播放器准备完成后,调用start()方法即可开始播放视频。
|
|
/**
|
|
|
|
* 高质量压缩
|
|
|
|
* @param filePath 源文件路径
|
|
|
|
* @param compressOutPut 输出文件路径
|
|
|
|
* @param VideoCompress.CompressListener 压缩过程监听
|
|
|
|
*/
|
|
|
|
VideoCompress.compressVideoHigh(filePath, compressOutPut, new VideoCompress.CompressListener() {
|
|
|
|
@Override
|
|
|
|
public void onStart() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
## 3.4 视频上传
|
|
@Override
|
|
|
|
public void onSuccess() {
|
|
|
|
|
|
SDK视频上传由Uploader类实现,Uploader通过HTTP协议与服务端进行通信,上传视频信息和视频文件。同时,SDK提供了上传回调接口UploadListener来监听视频上传流程,如果需要在应用中展示上传状态、上传进度等信息,可根据需要进行设置。
|
|
}
|
|
|
|
|
|
### 3.4.1 Uploader使用示例
|
|
@Override
|
|
|
|
public void onFail() {
|
|
|
|
|
|
使用Uploader上传前,请先了解Uploader的工作流程:
|
|
}
|
|
|
|
|
|
1. 创建Uploader实例,初始化视频信息,此时Uploader进入等待状态(WAIT)。
|
|
@Override
|
|
2. 当需要开始上传时,调用start()方法开始上传,此时Uploader进入上传状态(UPLOAD)。
|
|
public void onProgress(float percent) {
|
|
3. 当需要暂停上传时,调用pause()方法。另外,在上传过程中可能出现网络异常问题,当出现此问题时,Uploader默认会暂停当前上传操作,进入暂停状态(PAUSE)。
|
|
|
|
4. 当需要恢复上传时,调用resume()方法,若无网络异常等问题,此时Uploader会重新上传视频文件。
|
|
|
|
5. 当需要取消上作时,调用cancel()方法,此时Uploader会进入等待状态(WAIT)。
|
|
|
|
|
|
|
|
创建Uploader实例需提供VideoInfo(视频信息)和 API_KEY,使用示例如下:
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
```
|
|
```
|
|
VideoInfo videoInfo = new VideoInfo();
|
|
/**
|
|
videoInfo.setTitle("title");
|
|
* 中质量压缩
|
|
videoInfo.setTags("tag");
|
|
* @param filePath 源文件路径
|
|
videoInfo.setDescription("description");
|
|
* @param compressOutPut 输出文件路径
|
|
// 设置视频文件地址
|
|
* @param VideoCompress.CompressListener 压缩过程监听
|
|
videoInfo.setFilePath("filePath");
|
|
*/
|
|
// 设置账号信息
|
|
VideoCompress.compressVideoMedium(filePath, compressOutPut, new VideoCompress.CompressListener() {
|
|
videoInfo.setUserId("USERID");
|
|
@Override
|
|
// 设置回调信息
|
|
public void onStart() {
|
|
videoInfo.setNotifyUrl(“NOTIFY_URL");
|
|
|
|
Uploader uploader = new Uploader(videoInfo,"API_KEY");
|
|
}
|
|
// 开始上传
|
|
|
|
uploader.start();
|
|
|
|
```
|
|
|
|
|
|
|
|
VideoInfo是用来记录上传过程与视频相关的信息,在初始化视频信息时,服务端需根据视频的标题、标签、描述等来创建视频,所以在使用VideoInfo创建Uploader实例时,请确保视频信息非空。
|
|
@Override
|
|
|
|
public void onSuccess() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onFail() {
|
|
|
|
|
|
### 3.4.2 设置上传回调
|
|
}
|
|
|
|
|
|
Uploader在执行上传操作时,默认会检查是否设置了UploadListener。若已设置UploadListener,Uploader会回调UploadListener已实现的方法,若未设置,则不回调任何信息。UploadListener具体使用方法如下:
|
|
@Override
|
|
|
|
public void onProgress(float percent) {
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
```
|
|
```
|
|
UploadListener uploadListener = new UploadListener(){
|
|
/**
|
|
@Override
|
|
* 低质量压缩
|
|
public void handleProcess(long range, long size, String videoId) {
|
|
* @param filePath 源文件路径
|
|
// TODO 处理上传进度
|
|
* @param compressOutPut 输出文件路径
|
|
}
|
|
* @param VideoCompress.CompressListener 压缩过程监听
|
|
@Override
|
|
*/
|
|
public void handleException(DreamwinException exception, int status) {
|
|
VideoCompress.compressVideoLow(filePath, compressOutPut, new VideoCompress.CompressListener() {
|
|
// TODO 处理上传过程中出现的异常
|
|
@Override
|
|
}
|
|
public void onStart() {
|
|
@Override
|
|
|
|
public void handleStatus(VideoInfo videoInfo, int status) {
|
|
}
|
|
// TODO 处理上传回调的视频信息及上传状态,status=100(等待上传)、200(正在上传)、300(暂停上传)、400(上传完成)、500(上传失败)
|
|
|
|
}
|
|
@Override
|
|
@Override
|
|
public void onSuccess() {
|
|
public void handleCancel(String videoId) {
|
|
|
|
// TODO 处理取消上传的后续操作
|
|
|
|
}
|
|
|
|
@Override
|
|
|
|
public void onVideoInfoUpdate(VideoInfo videoInfo) {
|
|
|
|
// TODO 上传信息更新回调,可以在这里保存最新的videoInfo状态
|
|
|
|
}
|
|
|
|
};
|
|
|
|
uploader.setUploadListener(uploadListenner);
|
|
|
|
```
|
|
|
|
|
|
|
|
## 3.5 视频下载
|
|
}
|
|
|
|
|
|
SDK视频下载由Downloader类实现的,Downloader通过HTTP协议与服务端进行通信,获取视频下载地址。同时,SDK提供了下载回调接口DownloadListener来监听视频下载流程,如果需要向用户展示下载状态、下载进度等信息,可根据需要进行设置。
|
|
@Override
|
|
|
|
public void onFail() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
### 3.5.1 Downloader使用示例
|
|
@Override
|
|
|
|
public void onProgress(float percent) {
|
|
|
|
|
|
在使用Downloader前,请先了解Downloader的工作流程:
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
1. 创建Downloader实例,初始化视频文件下载信息,此时Downloader进入等待状态(WAIT)。
|
|
## 4.12 课堂练习功能
|
|
2. 当需要开始下载时,调用start()方法,此时Downloader进入下载状态(DOWNLOAD)。
|
|
|
|
3. 当需要暂停下载时,调用pause()方法。另外,在下载过程中可能出现网络异常问题,当出现此问题时,Downloader默认会暂停下载操作,进入暂停状态(PAUSE)。
|
|
|
|
4. 当需要恢复下载时,调用resume()方法。若无网络异常等问题,此时Downloader会重新下载视频文件。
|
|
|
|
5. 当需要取消视频下载时,调用cancel()方法,此时Downloader会进入等待状态(WAIT)。
|
|
|
|
|
|
|
|
创建Downloader实例需提供视频存储文件,视频ID、账户ID、API_KEY,示例如下:
|
|
支持用户自定义课堂练习功能的回调,可以通过调用player的setOnExercisesMsgListener(OnExercisesMsgListener onExercisesMsgListener)方法,当视频有课堂练习信息时,在该接口中回调课堂练习信息。
|
|
|
|
|
|
```
|
|
```
|
|
//提供一个下载路径
|
|
//获得视频课堂练习信息
|
|
String downloadPath = "/storage/emulated/0/HuodeDownload/";
|
|
player.setOnExercisesMsgListener(new OnExercisesMsgListener() {
|
|
//fileName是文件名,例如“huode”。注意:此文件名不包括后缀名,后缀名会根据云端视频文件格式自动设置。
|
|
@Override
|
|
Downloader downloader = new Downloader(downloadPath,fileName,videoId, "USERID","API_KEY",null);
|
|
public void onExercisesMessage(JSONArray exArray) {
|
|
//设置下载重连次数 取值范围(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){
|
|
课堂练习回调的格式为JSONArray,单条课堂练习的内容如下,请用户自行解析。
|
|
downloader.setDownloadMode(MediaMode.VIDEO);
|
|
|
|
}else if (downloadMode==2){
|
|
```
|
|
downloader.setDownloadMode(MediaMode.AUDIO);
|
|
{
|
|
|
|
"id": 86,
|
|
|
|
"questions": [
|
|
|
|
|
|
|
|
{
|
|
|
|
"answers": [
|
|
|
|
{
|
|
|
|
"content": "A、答案A",
|
|
|
|
"id": 608,
|
|
|
|
"right": true
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"content": "B、答案B",
|
|
|
|
"id": 609,
|
|
|
|
"right": true
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"content": "C、答案C",
|
|
|
|
"id": 610,
|
|
|
|
"right": true
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"content": "D、答案D",
|
|
|
|
"id": 615,
|
|
|
|
"right": false
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"content": "题目",
|
|
|
|
"explainInfo": "试题详解",
|
|
|
|
"id": 414,
|
|
|
|
"type": 1
|
|
}
|
|
}
|
|
// 开始下载
|
|
|
|
downloader.start();
|
|
],
|
|
|
|
"showTime": 20,
|
|
|
|
"title": "课堂练习"
|
|
|
|
}
|
|
```
|
|
```
|
|
|
|
|
|
### 3.5.2 设置下载回调
|
|
## 4.13 投屏功能
|
|
|
|
在播放时可以投射到电视或其他支持投屏的设备,分为非加密视频的投屏和加密视频的投屏。
|
|
Downloader在执行下载操作时,默认会检查是否设置了DownloadListener。若已设置DownloadListener,Downloader会回调DownloadListener接口已实现的方法,若未设置,则不回调任何信息。DownloadListener使用方法如下:
|
|
### 4.13.1 非加密视频的投屏
|
|
|
|
```
|
|
|
|
//搜索发现设备
|
|
|
|
registryListener.setOnDeviceListChangedListener(new ProjectionDeviceListChangedListener() {
|
|
|
|
@Override
|
|
|
|
public void onDeviceAdded(ProjectionIDevice device) {
|
|
|
|
//发现设备
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onDeviceRemoved(ProjectionIDevice device) {
|
|
|
|
//设备移除
|
|
|
|
}
|
|
|
|
});
|
|
```
|
|
```
|
|
DownloadListener downloadListener = new DownloadListener(){
|
|
|
|
@Override
|
|
|
|
public void handleProcess(long start, long end, String videoId) {
|
|
|
|
// TODO 处理下载进度
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
```
|
|
public void handleException(DreamwinException exception, int status) {
|
|
//播放新的视频
|
|
// TODO 处理下载过程中发生的异常信息
|
|
projectionPlayControl.playNew(playUrl, new ProjectionControlCallback() {
|
|
}
|
|
@Override
|
|
|
|
public void success(ProjectionIResponse response) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void handleStatus(String videoId, int status) {
|
|
public void fail(ProjectionIResponse response) {
|
|
// TODO 处理视频下载信息及相应状态,status下载状态:100表示等待中,200表示下载中,300表示下载暂停,400表示下载完成
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
}
|
|
public void handleCancel(String videoId) {
|
|
});
|
|
// TODO 处理取消下载的后续操作
|
|
```
|
|
}
|
|
```
|
|
|
|
//暂停后恢复播放
|
|
|
|
projectionPlayControl.play(new ProjectionControlCallback() {
|
|
|
|
@Override
|
|
|
|
public void success(ProjectionIResponse response) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void getFormat(String format) {
|
|
public void fail(ProjectionIResponse response) {
|
|
//获得文件的格式format
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
downloader.setDownloadListener(downloadListener);
|
|
}
|
|
|
|
});
|
|
```
|
|
```
|
|
|
|
```
|
|
|
|
//暂停播放
|
|
|
|
projectionPlayControl.pause(new ProjectionControlCallback() {
|
|
|
|
@Override
|
|
|
|
public void success(ProjectionIResponse response) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
### 3.5.3 选择清晰度下载
|
|
@Override
|
|
|
|
public void fail(ProjectionIResponse response) {
|
|
|
|
|
|
流程如下:
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
1. 创建Downloader实例;
|
|
### 4.13.2 加密视频的投屏
|
|
2. 调用setOnProcessDefinitionListener()方式设置清晰度回调;
|
|
加密视频不可直接投屏,请打开手机的投屏功能,详情参考Demo。
|
|
3. 调用getDefinitionMap()方法获取清晰度;
|
|
|
|
4. 根据获取的清晰度,调用setDownloadDefinition()方法设置想要的清晰度;
|
|
|
|
5. 调用start()下载指定清晰度。
|
|
|
|
|
|
|
|
获取清晰度时需实现OnProcessDefinitionListener接口的onProcessDefinition()方法,并调用Downloader的setOnProcessDefinitionListener()方法设置获取清晰度回调,获取清晰度的示例如下:
|
|
## 4.14 防录屏
|
|
|
|
在播放视频时,调用setAntiRecordScreen()方法防录屏。
|
|
|
|
```
|
|
|
|
//开启防录屏,会使加密视频投屏功能不能正常使用
|
|
|
|
player.setAntiRecordScreen(activity);
|
|
|
|
```
|
|
|
|
|
|
|
|
## 4.15 视频水印
|
|
|
|
上传视频的时候,支持为视频配置水印。
|
|
|
|
```
|
|
|
|
//水印位置0,左上 1右上 2左下 3右下,默认3,非必填
|
|
|
|
videoInfo.setCorner(int corner);
|
|
|
|
//X轴偏移像素值,要求大于0,默认值5,超出视频大小按默认值,非必填
|
|
|
|
videoInfo.setOffsetx(int offsetx);
|
|
|
|
//Y轴偏移像素值,要求大于0,默认值5,超出视频大小按默认值,非必填
|
|
|
|
videoInfo.setOffsety(int offsety);
|
|
|
|
//字体类型:0,微软雅黑 1宋体 2黑体,默认0,非必填
|
|
|
|
videoInfo.setFontfamily(int fontfamily);
|
|
|
|
//字体大小,[0-100],默认12
|
|
|
|
videoInfo.setFontsize(int fontsize);
|
|
|
|
//16进制字体颜色,如#FFFFFF,不能写#号,默认灰色D3D3D3,非必填
|
|
|
|
videoInfo.setFontcolor(String fontcolor);
|
|
|
|
//透明度,[0-100],默认0,100为不透明,非必填
|
|
|
|
videoInfo.setFontalpha(int fontalpha);
|
|
|
|
//水印文字内容, 1-50个字符,数字、字母、汉字,不填写则文字水印不生效,填写错误,会导致上传失败
|
|
|
|
videoInfo.setText(String text);
|
|
```
|
|
```
|
|
class DownloadDemo{
|
|
|
|
private HashMap<Integer, String> dm;
|
|
|
|
private Downlaoder downloader;
|
|
|
|
|
|
|
|
private OnProcessDefinitionListener onProcessDefinitionListener = new OnProcessDefinitionListener(){
|
|
## 4.16 切换到备用线路
|
|
@Override
|
|
调用player.setBackupPlay(true)方法切换到备用线路,具体使用参照Demo。
|
|
public void onProcessDefinition(HashMap<Integer, String> definitionMap) {
|
|
|
|
if(definitionMap != null){
|
|
|
|
dm = definitionMap;
|
|
|
|
} else {
|
|
|
|
Log.e("get definition error", "视频清晰度获取失败");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
## 4.17 获取播放时长和暂停时长
|
|
public void onProcessException(DreamwinException exception) {
|
|
|
|
Log.i("get definition exception", exception.getErrorCode().Value());
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
```
|
|
|
|
//获取播放时长(单位是秒)
|
|
|
|
player.getPlayedTime();
|
|
|
|
|
|
private getDefinition(){
|
|
//获取暂停时长(单位是秒)
|
|
downloader.setOnProcessDefinitionListener(onProcessDefinitionListener);
|
|
player.getPausedTime();
|
|
downloader.getDefinitionMap();
|
|
|
|
}
|
|
|
|
……
|
|
|
|
|
|
|
|
}
|
|
//当切换到另外一个视频时,需要调用player.resetPlayedAndPausedTime(),将上一个视频的播放时长和暂停时长重置为0
|
|
|
|
player.resetPlayedAndPausedTime();
|
|
```
|
|
```
|
|
|
|
|
|
### 3.5.4 设置下载重试次数
|
|
## 4.18 跑马灯
|
|
|
|
|
|
|
|
使用跑马灯。
|
|
```
|
|
```
|
|
//设置下载重试次数,默认为0,可设置区间[0, 100]
|
|
<com.bokecc.sdk.mobile.play.MarqueeView
|
|
setReconnectLimit(int reconnectLimit)
|
|
android:id="@+id/mv_video"
|
|
|
|
android:layout_width="match_parent"
|
|
|
|
android:layout_height="match_parent"
|
|
|
|
/>
|
|
```
|
|
```
|
|
|
|
设置跑马灯类型。
|
|
### 3.5.5 设置超时时间
|
|
|
|
|
|
|
|
```
|
|
```
|
|
//设置网络请求的超时时间,区间[5000-30000],单位为ms,默认值为10000ms
|
|
//MarqueeView.TEXT:文字 MarqueeView.IMAGE:图片
|
|
setTimeOut(int timeOut)
|
|
mv_video.setType();
|
|
```
|
|
```
|
|
|
|
设置循环次数。
|
|
|
|
```
|
|
|
|
//loop:为-1时是无限循环,为其他正整数时是有限次循环
|
|
|
|
mv_video.setLoop(loop);
|
|
|
|
```
|
|
|
|
设置跑马灯动作节点,可定义多个节点。
|
|
|
|
```
|
|
|
|
//创建动作节点
|
|
|
|
MarqueeAction marqueeAction = new MarqueeAction();
|
|
|
|
//index:动作的执行顺序
|
|
|
|
marqueeAction.setIndex(index);
|
|
|
|
//duration:动作的执行时间(单位:ms)
|
|
|
|
marqueeAction.setDuration(duration);
|
|
|
|
//startXpos:动作起始点距离视频左上角原点水平距离,数据类型float,取值范围0~1,
|
|
|
|
//具体距离:视频宽度*startXpos
|
|
|
|
marqueeAction.setStartXpos(startXpos);
|
|
|
|
//startYpos:动作起始点距离视频左上角原点垂直距离,数据类型float,取值范围0~1
|
|
|
|
//具体距离:视频高度*startYpos
|
|
|
|
marqueeAction.setStartYpos(startYpos);
|
|
|
|
//startAlpha:起始点透明度,数据类型float,取值范围0~1
|
|
|
|
marqueeAction.setStartAlpha(startAlpha);
|
|
|
|
//endXpos:动作结束点距离视频左上角原点水平距离,数据类型float,取值范围0~1,
|
|
|
|
//具体距离:视频宽度*endXpos
|
|
|
|
marqueeAction.setEndXpos(endXpos);
|
|
|
|
//endYpos:动作结束点距离视频左上角原点垂直距离,数据类型float,取值范围0~1
|
|
|
|
//具体距离:视频高度*endYpos
|
|
|
|
marqueeAction.setEndYpos(endYpos);
|
|
|
|
//endAlpha:结束点透明度,数据类型float,取值范围0~1
|
|
|
|
marqueeAction.setEndAlpha(endAlpha);
|
|
|
|
|
|
|
|
|
|
## 3.6 音频支持
|
|
//设置动作节点,marqueeActions:一组动作节点
|
|
|
|
mv_video.setMarqueeActions(marqueeActions);
|
|
SDK音频播放由DWMediaPlayer类实现,DWMediaPlayer继承了Android的媒体播放器MediaPlayer类,并重载其prepare()和prepareAsync()方法。
|
|
|
|
|
|
|
|
### 3.6.1 音频在线播放
|
|
|
|
|
|
|
|
目前播放器默认支持的为视频播放,想要进行音频播放,在prepareAsync()之前则需要如下设置:
|
|
```
|
|
|
|
|
|
|
|
设置文字内容。
|
|
```
|
|
```
|
|
player.setDefaultPlayMode(MediaMode.AUDIO, onPlayModeListener);
|
|
//textContent:是文字内容
|
|
player.setAudioPlay(true);
|
|
mv_video.setTextContent(textContent);
|
|
player.prepareAsync();
|
|
|
|
```
|
|
```
|
|
|
|
设置文字字体大小。
|
|
如果默认设置的为支持音视频模式,那么从视频切换到音频的方法为如下:
|
|
|
|
|
|
|
|
```
|
|
```
|
|
player.reset();
|
|
//textSize:文字字体大小(单位px)
|
|
player.setAudioPlay(true)
|
|
mv_video.setTextFontSize(textSize);
|
|
player.prepareAsync();
|
|
|
|
```
|
|
```
|
|
|
|
设置文字颜色。
|
|
|
|
```
|
|
|
|
//textColor:文字颜色,如#ffffff
|
|
|
|
mv_video.setTextColor(textColor);
|
|
|
|
```
|
|
|
|
通过url设置跑马灯图片。
|
|
|
|
```
|
|
|
|
/**
|
|
|
|
* @param activity 上下文
|
|
|
|
* @param imageUrl 图片url
|
|
|
|
* @param imageWidth 图片宽度(单位px)
|
|
|
|
* @param imageHeight 图片高度(单位px)
|
|
|
|
*/
|
|
|
|
mv_video.setMarqueeImage(activity, imageUrl, imageWidth, imageHeight);
|
|
|
|
|
|
注:onPlayModeListener的回调返回该视频节点信息支持的播放模式。如果没有节点信息,onPlayModeListener的回调返回为null。
|
|
//设置跑马灯图片加载监听
|
|
|
|
mv_video.setOnMarqueeImgFailListener(new OnMarqueeImgFailListener() {
|
|
### 3.6.2 音频本地播放
|
|
@Override
|
|
|
|
public void onLoadMarqueeImgFail() {
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
通过Bitmap设置跑马灯图片。
|
|
|
|
```
|
|
|
|
/**
|
|
|
|
* @param bitmap 图片bitmap
|
|
|
|
* @param imageWidth 图片宽度(单位px)
|
|
|
|
* @param imageHeight 图片高度(单位px)
|
|
|
|
*/
|
|
|
|
mv_video.setMarqueeImage(bitmap, imageWidth, imageHeight);
|
|
|
|
```
|
|
|
|
运行跑马灯。
|
|
|
|
```
|
|
|
|
mv_video.start();
|
|
|
|
```
|
|
|
|
|
|
参考章节3.3.2
|
|
## 4.19 错误处理
|
|
|
|
错误信息有两种,一种是播放器触发的错误,另一种是获得场景视频自定义的错误。
|
|
|
|
### 4.19.1 监听播放器的错误事件
|
|
|
|
DWMediaPlayer重载了MediaPlayer的setOnErrorListener()方法,如果需要在应用中提示错误信息,可调用此方法设置OnErrorListener。具体实现方式如下:
|
|
|
|
|
|
### 3.6.3 音频下载
|
|
```
|
|
|
|
player.setOnErrorListener(new MediaPlayer.OnErrorListener() {
|
|
|
|
@Override
|
|
|
|
public boolean onError(MediaPlayer mp, int what, int extra) {
|
|
|
|
//在这里进行错误处理
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
### 4.19.2 监听获得场景视频自定义的错误事件
|
|
|
|
|
|
参考3.5。
|
|
```
|
|
下载前需要调用setDownloadMode(MediaMode downloadMode)来设置下载的模式。 |
|
player.setOnDreamWinErrorListener(new OnDreamWinErrorListener() {
|
|
\ No newline at end of file |
|
@Override
|
|
|
|
public void onPlayError(HuodeException e) {
|
|
|
|
//在这里进行错误处理
|
|
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 4.20 错误码
|
|
|
|
|
|
|
|
### 4.20.1 HuodeException自定义的错误码
|
|
|
|
|
|
|
|
```
|
|
|
|
101:无播放节点
|
|
|
|
102:视频无播放节点
|
|
|
|
103:音频无播放节点
|
|
|
|
104:授权验证失败
|
|
|
|
105:视频无法播放,请检查视频状态
|
|
|
|
106:请求播放数据失败,检查网络连接,检查UserId和ApiKey是否正确
|
|
|
|
107:服务端响应失败
|
|
|
|
108:获取服务器信息失败
|
|
|
|
109:视频已删除
|
|
|
|
111:请求播放数据时出现未知错误
|
|
|
|
112:获取当前播放清晰度出现异常
|
|
|
|
113:播放离线视频时出现未知错误
|
|
|
|
|
|
|
|
201:下载地址不存在
|
|
|
|
202:视频下载节点不存在
|
|
|
|
203:下载失败,请检查视频状态
|
|
|
|
204:下载授权验证失败
|
|
|
|
205:请求下载数据失败
|
|
|
|
206:请求下载,服务端响应失败
|
|
|
|
207:下载请求的结果无效
|
|
|
|
208:获取下载清晰度的OnProcessDefinitionListener为空
|
|
|
|
209:设置下载结束点异常
|
|
|
|
210:请求下载地址响应码异常
|
|
|
|
211:被请求的下载文件无效或者本地设置的下载路径无效
|
|
|
|
212:下载初始化时出现IO异常
|
|
|
|
213:下载初始化时出现JSONException
|
|
|
|
214:下载初始化时出现NullPointerException
|
|
|
|
215:下载初始化时出现未知异常
|
|
|
|
216:恢复下载时出现IO异常
|
|
|
|
217:恢复下载时出现JSONException
|
|
|
|
218:恢复下载时出现NullPointerException
|
|
|
|
219:恢复下载时出现未知异常
|
|
|
|
220:获取下载清晰度时出现JSONException
|
|
|
|
221:下载设置的文件名为空
|
|
|
|
|
|
|
|
301:初始化上传信息失败
|
|
|
|
302:上传spark请求失败
|
|
|
|
303:上传时检查是否为续传时异常
|
|
|
|
304:检查上传时转化结果类型异常
|
|
|
|
305:检查上传时返回结果为空值
|
|
|
|
306:检查上传结果时失败
|
|
|
|
307:检查不到上传结果异常
|
|
|
|
308:上传请求异常,请检查网络连接
|
|
|
|
309:恢复上传时失败
|
|
|
|
310:恢复上传时出现未知错误
|
|
|
|
311:上传请求参数无效
|
|
|
|
312:上述时请求Spark时出现IOException
|
|
|
|
313:上传文件时出现IOException
|
|
|
|
314:上传结束当前线程时出现InterruptedException
|
|
|
|
315:上述时请求Spark时出现XmlPullParserException
|
|
|
|
316:水印文字颜色错误
|
|
|
|
317:水印文字内容错误
|
|
|
|
|
|
|
|
|
|
|
|
401:片头广告请求失败
|
|
|
|
402:片头广告Json解析失败
|
|
|
|
403:暂停广告请求失败
|
|
|
|
404:暂停广告Json解析失败
|
|
|
|
405:片头广告数据不存在
|
|
|
|
406:片头广告数据错误
|
|
|
|
407:暂停广告数据不存在
|
|
|
|
408:暂停广告数据错误
|
|
|
|
|
|
|
|
501:文件不存在
|
|
|
|
502:不是一个pcm文件
|
|
|
|
503:DRM加密版本错误
|
|
|
|
504:源文件不存在
|
|
|
|
505:加载数据失败
|
|
|
|
```
|
|
|
|
|
|
|
|
### 4.20.2 ijkplayer错误码
|
|
|
|
|
|
|
|
```
|
|
|
|
int MEDIA_INFO_UNKNOWN = 1;//未知信息
|
|
|
|
int MEDIA_INFO_STARTED_AS_NEXT = 2;//播放下一条
|
|
|
|
int MEDIA_INFO_VIDEO_RENDERING_START = 3;//视频开始整备中,准备渲染
|
|
|
|
int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700;//视频日志跟踪
|
|
|
|
int MEDIA_INFO_BUFFERING_START = 701;//开始缓冲中 开始缓冲
|
|
|
|
int MEDIA_INFO_BUFFERING_END = 702;//缓冲结束
|
|
|
|
int MEDIA_INFO_NETWORK_BANDWIDTH = 703;//网络带宽,网速方面
|
|
|
|
int MEDIA_INFO_NOT_SEEKABLE = 801;//不可设置播放位置,直播方面
|
|
|
|
int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901;//不支持字幕
|
|
|
|
int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902;//字幕超时
|
|
|
|
int MEDIA_INFO_VIDEO_INTERRUPT= -10000;//数据连接中断,一般是视频源有问题或者数据格式不支持,比如音频不是AAC之类的
|
|
|
|
int MEDIA_INFO_VIDEO_ROTATION_CHANGED = 10001;//视频方向改变,视频选择信息
|
|
|
|
int MEDIA_INFO_AUDIO_RENDERING_START = 10002;//音频开始整备中
|
|
|
|
int MEDIA_ERROR_SERVER_DIED = 100;//服务挂掉,视频中断,一般是视频源异常或者不支持的视频类型
|
|
|
|
int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;//数据错误没有有效的回收
|
|
|
|
int MEDIA_ERROR_IO = -1004;//IO 错误
|
|
|
|
int MEDIA_ERROR_MALFORMED = -1007;比特流不符合相关的编码标准和文件规范
|
|
|
|
int MEDIA_ERROR_UNSUPPORTED = -1010;//数据不支持
|
|
|
|
int MEDIA_ERROR_TIMED_OUT = -110;//数据超时
|
|
|
|
``` |