|
|
## 4.1 广告功能
|
|
|
|
|
|
1. 本功能需要后台开通移动广告;
|
|
|
2. 广告核心类DWMediaAD提供能了获取广告信息的方法,广告详细信息通过DWMediaADListener监听器回调来获取;
|
|
|
3. 广告分为前贴和暂停,需要分别调用方法来获取。其中前贴目前提供了视频和图片广告,暂停只有图片广告。
|
|
|
|
|
|
```
|
|
|
……
|
|
|
DWMediaAD mDWMediaAD = new DWMediaAD(dwMediaADlistener, USERID, videoId);
|
|
|
mDWMediaAD.getFrontAD();
|
|
|
mDWMediaAD.getPauseAD();
|
|
|
……
|
|
|
// 广告监听器
|
|
|
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) {
|
|
|
}
|
|
|
};
|
|
|
```
|
|
|
|
|
|
注:目前只提供获取广告信息的接口,广告界面需要用户自行实现
|
|
|
|
|
|
## 4.2 用户自定义参数播放统计功能
|
|
|
|
|
|
支持用户自定义参数实现播放的统计,可以通过调用player的setCustomId(String customId)方法来实现,其中customId为用户自己定义的参数值。
|
|
|
|
|
|
```
|
|
|
//设置CustomId
|
|
|
player.setCustomId("Huode");
|
|
|
```
|
|
|
|
|
|
注:需要在prepareAsync()方法前调用才可以生效。
|
|
|
|
|
|
|
|
|
## 4.3 视频打点功能
|
|
|
|
|
|
支持用户自定义视频打点功能的回调,可以通过调用player的setOnHotspotListener(OnHotspotListener onHotspotListener)方法,当视频有打点信息时,在该接口中回调打点信息。
|
|
|
|
|
|
```
|
|
|
//获得视频打点信息
|
|
|
player.setOnHotspotListener(new OnHotspotListener() {
|
|
|
/**
|
|
|
* @param hotspotMap key为时间(秒),value是打点描述
|
|
|
*/
|
|
|
@Override
|
|
|
public void onHotspots(TreeMap<Integer, String> hotspotMap) {
|
|
|
|
|
|
}
|
|
|
});
|
|
|
```
|
|
|
|
|
|
## 4.4 视频问答功能
|
|
|
|
|
|
支持用户自定义视频问答功能的回调,可以通过调用player的setOnQAMsgListener(OnQAMsgListener qaMsgListener)方法,当视频有问答信息时,在该接口中回调问答信息。
|
|
|
|
|
|
```
|
|
|
//获得视频问答信息
|
|
|
player.setOnQAMsgListener(new OnQAMsgListener() {
|
|
|
/**
|
|
|
* @param qaJsonArray,单条信息包含有question和answer
|
|
|
*/
|
|
|
@Override
|
|
|
public void onQAMessage(JSONArray qaJsonArray) {
|
|
|
|
|
|
}
|
|
|
});
|
|
|
```
|
|
|
|
|
|
问答信息回调的格式为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
|
|
|
}
|
|
|
```
|
|
|
|
|
|
## 4.5 视频显示字幕功能
|
|
|
|
|
|
支持从服务器获取字幕资源并显示,可以通过调用player的setOnSubtitleMsgListener(OnSubtitleMsgListener onSubtitleMsgListener)方法,当有字幕资源时,在该接口中回调字幕信息。
|
|
|
|
|
|
```
|
|
|
//获得字幕信息
|
|
|
player.setOnSubtitleMsgListener(new OnSubtitleMsgListener() {
|
|
|
/**
|
|
|
* 第一种字幕,设置这些字幕样式需要在主线程操作
|
|
|
* @param subtitleName 字幕名称
|
|
|
* @param sort 字幕位置顺序
|
|
|
* @param url 字幕资源地址
|
|
|
* @param font 字体名称,需要在工程的assets(没有请自行创建)
|
|
|
* 文件夹下有对应的字体文件,自行实现字体显示逻辑
|
|
|
* @param size 字体大小
|
|
|
* @param color 字体颜色
|
|
|
* @param surroundColor 字体环绕色
|
|
|
* @param bottom 距离底部的边距占手机屏幕宽度的百分比
|
|
|
* @param code 字幕编码格式,如utf-8
|
|
|
*/
|
|
|
@Override
|
|
|
public void onSubtitleMsg(String subtitleName, int sort, String url, String font, int size, String color, String surroundColor, double bottom, String code) {
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 第二种字幕,设置这些字幕样式需要在主线程操作
|
|
|
* @param subtitleName 字幕名称
|
|
|
* @param sort 字幕位置顺序
|
|
|
* @param url 字幕资源地址
|
|
|
* @param font 字体名称,需要在工程的assets(没有请自行创建)
|
|
|
* 文件夹下有对应的字体文件,自行实现字体显示逻辑
|
|
|
* @param size 字体大小
|
|
|
* @param color 字体颜色
|
|
|
* @param surroundColor 字体环绕色
|
|
|
* @param bottom 距离底部的边距占手机屏幕宽度的百分比
|
|
|
* @param code 字幕编码格式,如utf-8
|
|
|
*/
|
|
|
@Override
|
|
|
public void onSecSubtitleMsg(String subtitleName, int sort, String url, String font, int size, String color, String surroundColor, double bottom, String code) {
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param defaultSubtitle 0默认显示第一种字幕,1默认显示第二种字幕,2默认显示双语字幕
|
|
|
*/
|
|
|
@Override
|
|
|
public void onDefSubtitle(int defaultSubtitle) {
|
|
|
|
|
|
}
|
|
|
});
|
|
|
```
|
|
|
|
|
|
## 4.6 访客信息收集功能
|
|
|
|
|
|
支持从服务器获取访客信息收集设置并显示,可以通过调用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
|
|
|
public void onVisitMsg(int appearTime, String imageURL, int isJump, String jumpURL, String title, String visitorId, JSONArray visitorMessage) {
|
|
|
|
|
|
}
|
|
|
});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
## 4.7 倍速功能
|
|
|
|
|
|
倍速功能使用第三方库IjkMediaPlayer v0.8.4来实现。倍速播放功能需要使用DWIjkMediaPlayer类,该类继承自第三方库IjkMediaPlayer的IjkMediaPlayer类,该类的使用方法和DWMediaPlayer一样。
|
|
|
|
|
|
IjkMeidaPlayer的github地址如下:(请参考链接:https://github.com/Bilibili/ijkplayer)
|
|
|
|
|
|
设置倍速方法如下:
|
|
|
|
|
|
```
|
|
|
player.setSpeed();
|
|
|
```
|
|
|
|
|
|
**ijkspeed文件夹为ijk所需要的so文件和jar,请放到自己的工程目录使用。**
|
|
|
|
|
|
## 4.8 辅助调试工具
|
|
|
|
|
|
SDK提供HTTP通信日志调试功能。在使用SDK进行播放、上传、下载过程中,如果遇到与网络通信相关的问题,可通过设置HTTP日志的级别获取通信信息。使用示例如下:
|
|
|
|
|
|
```
|
|
|
// 设置HTTP通信日志级别
|
|
|
HttpUtil.LOG_LEVEL = HttpLogLevel.DETAIL;
|
|
|
```
|
|
|
|
|
|
默认日志级别为GENERAL(记录HTTP通信发生时间、响应状态码)。
|
|
|
|
|
|
## 4.9 问答统计功能
|
|
|
|
|
|
要统计问答的结果,只需在提交答案时调用下面这个方法:
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @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 视频压缩功能
|
|
|
|
|
|
可以选择高质量压缩、中质量压缩、低质量压缩,压缩质量越高,压缩出来的文件就相对较大。
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* 高质量压缩
|
|
|
* @param filePath 源文件路径
|
|
|
* @param compressOutPut 输出文件路径
|
|
|
* @param VideoCompress.CompressListener 压缩过程监听
|
|
|
*/
|
|
|
VideoCompress.compressVideoHigh(filePath, compressOutPut, new VideoCompress.CompressListener() {
|
|
|
@Override
|
|
|
public void onStart() {
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onSuccess() {
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onFail() {
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onProgress(float percent) {
|
|
|
|
|
|
}
|
|
|
});
|
|
|
```
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* 中质量压缩
|
|
|
* @param filePath 源文件路径
|
|
|
* @param compressOutPut 输出文件路径
|
|
|
* @param VideoCompress.CompressListener 压缩过程监听
|
|
|
*/
|
|
|
VideoCompress.compressVideoMedium(filePath, compressOutPut, new VideoCompress.CompressListener() {
|
|
|
@Override
|
|
|
public void onStart() {
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onSuccess() {
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onFail() {
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onProgress(float percent) {
|
|
|
|
|
|
}
|
|
|
});
|
|
|
```
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* 低质量压缩
|
|
|
* @param filePath 源文件路径
|
|
|
* @param compressOutPut 输出文件路径
|
|
|
* @param VideoCompress.CompressListener 压缩过程监听
|
|
|
*/
|
|
|
VideoCompress.compressVideoLow(filePath, compressOutPut, new VideoCompress.CompressListener() {
|
|
|
@Override
|
|
|
public void onStart() {
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onSuccess() {
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onFail() {
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onProgress(float percent) {
|
|
|
|
|
|
}
|
|
|
});
|
|
|
```
|
|
|
|
|
|
## 4.12 错误处理
|
|
|
错误信息有两种,一种是播放器触发的错误,另一种是获得场景视频自定义的错误。
|
|
|
### 4.12.1 监听播放器的错误事件
|
|
|
DWMediaPlayer重载了MediaPlayer的setOnErrorListener()方法,如果需要在应用中提示错误信息,可调用此方法设置OnErrorListener。具体实现方式如下:
|
|
|
|
|
|
```
|
|
|
player.setOnErrorListener(new MediaPlayer.OnErrorListener() {
|
|
|
@Override
|
|
|
public boolean onError(MediaPlayer mp, int what, int extra) {
|
|
|
//在这里进行错误处理
|
|
|
return true;
|
|
|
}
|
|
|
});
|
|
|
```
|
|
|
### 4.12.2 监听获得场景视频自定义的错误事件
|
|
|
|
|
|
```
|
|
|
player.setOnDreamWinErrorListener(new OnDreamWinErrorListener() {
|
|
|
@Override
|
|
|
public void onPlayError(HuodeException e) {
|
|
|
//在这里进行错误处理
|
|
|
}
|
|
|
});
|
|
|
```
|
|
|
|
|
|
|
|
|
## 4.13 错误码
|
|
|
|
|
|
### 4.13.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
|
|
|
|
|
|
401:片头广告请求失败
|
|
|
402:片头广告Json解析失败
|
|
|
403:暂停广告请求失败
|
|
|
404:暂停广告Json解析失败
|
|
|
405:片头广告数据不存在
|
|
|
406:片头广告数据错误
|
|
|
407:暂停广告数据不存在
|
|
|
408:暂停广告数据错误
|
|
|
|
|
|
501:文件不存在
|
|
|
502:不是一个pcm文件
|
|
|
503:DRM加密版本错误
|
|
|
504:源文件不存在
|
|
|
505:加载数据失败
|
|
|
```
|
|
|
|
|
|
### 4.13.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;//数据超时
|
|
|
``` |