3.1 导入SDK
有两种引入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.4.1'
//播放加密视频必须引用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'
}
3.在使用投屏功能时还需要做以下配置,不使用投屏不需要配置。
在App的build.gradle的文件中配置:
android {
//使用投屏功能时需要添加此配置
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/beans.xml'
}
}
在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
下载最新版本的SDK,下载地址为:CCVideo/VOD_Android_SDK,将huodesdk.jar和httplib.jar添加到Android项目中,并配置当前项目可正确的引用类库。
3.2 配置项目的网络权限和文件读写权限:
<!-- 用于网络通信 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 用于存储已下载文件 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3.3 视频播放
SDK视频播放由DWMediaPlayer类实现,使用DWMediaPlayer既可播放获得场景视频云服务平台下的视频(以下简称在线播放),也可播放本地视频。播放加密视频需要启动DRMServer,启动DRMServer后可以播放加密视频和非加密视频,若只是播放非加密视频不需要启动DRMServer。
在自定义的HuodeApplication(这个类名可以自定义)启动DRMServer:
public class HuodeApplication extends Application {
private static DRMServer drmServer;
private static int drmServerPort;
@Override
public void onCreate() {
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
public String get(String key) {
return sp.getString(key, "");
}
};
DWStorageUtil.setDWSdkStorage(myDWSdkStorage);
}
@Override
public void onTerminate() {
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;
}
}
在AndroidManifest.xml文件中配置自定义的HuodeApplication:
<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(上下文信息)即可播放云端视频。具体实现方式如下:
- 配置布局文件
<?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>
- 编写播放代码
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(获取视频标题)等方法,开发者可根据需要在应用中展示相应的信息。
选择清晰度播放
DWMediaPlayer提供了getDefinitions()方法获取当前播放的视频清晰度列表。如果需要切换视频的清晰度,可根据当前视频的清晰度对DWMediaPlayer进行设置。具体实现方式如下:
// 获取清晰度列表
Map<String, Integer> definitions = player.getDefinitions();
// 获取某种清晰度对应的状态码
int definitionCode = definitions.get("definitionInfo");
// 设置播放清晰度
player.setDefaultDefinition(definitionCode);
player.setDefinition(context, definitionCode);
设置OnDreamWinErrorListener
DWMediaPlayer获取播放地址产生的异常需要通过OnDreamWinErrorListener来获取异常,需要用户自行设置该监听。
// 设置错误信息监听器
player.setOnDreamWinErrorListener(...)
3.3.2 本地播放
在使用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();
当播放器准备完成后,调用start()方法即可开始播放视频。
3.4 视频上传
SDK视频上传由Uploader类实现,Uploader通过HTTP协议与服务端进行通信,上传视频信息和视频文件。同时,SDK提供了上传回调接口UploadListener来监听视频上传流程,如果需要在应用中展示上传状态、上传进度等信息,可根据需要进行设置。
3.4.1 Uploader使用示例
使用Uploader上传前,请先了解Uploader的工作流程:
- 创建Uploader实例,初始化视频信息,此时Uploader进入等待状态(WAIT)。
- 当需要开始上传时,调用start()方法开始上传,此时Uploader进入上传状态(UPLOAD)。
- 当需要暂停上传时,调用pause()方法。另外,在上传过程中可能出现网络异常问题,当出现此问题时,Uploader默认会暂停当前上传操作,进入暂停状态(PAUSE)。
- 当需要恢复上传时,调用resume()方法,若无网络异常等问题,此时Uploader会重新上传视频文件。
- 当需要取消上作时,调用cancel()方法,此时Uploader会进入等待状态(WAIT)。
创建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创建Uploader实例时,请确保视频信息非空。
3.4.2 设置上传回调
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);
3.5 视频下载
SDK视频下载由Downloader类实现的,Downloader通过HTTP协议与服务端进行通信,获取视频下载地址。同时,SDK提供了下载回调接口DownloadListener来监听视频下载流程,如果需要向用户展示下载状态、下载进度等信息,可根据需要进行设置。
3.5.1 Downloader使用示例
在使用Downloader前,请先了解Downloader的工作流程:
- 创建Downloader实例,初始化视频文件下载信息,此时Downloader进入等待状态(WAIT)。
- 当需要开始下载时,调用start()方法,此时Downloader进入下载状态(DOWNLOAD)。
- 当需要暂停下载时,调用pause()方法。另外,在下载过程中可能出现网络异常问题,当出现此问题时,Downloader默认会暂停下载操作,进入暂停状态(PAUSE)。
- 当需要恢复下载时,调用resume()方法。若无网络异常等问题,此时Downloader会重新下载视频文件。
- 当需要取消视频下载时,调用cancel()方法,此时Downloader会进入等待状态(WAIT)。
创建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();
3.5.2 设置下载回调
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);
3.5.3 选择清晰度下载
流程如下:
- 创建Downloader实例;
- 调用setOnProcessDefinitionListener()方式设置清晰度回调;
- 调用getDefinitionMap()方法获取清晰度;
- 根据获取的清晰度,调用setDownloadDefinition()方法设置想要的清晰度;
- 调用start()下载指定清晰度。
获取清晰度时需实现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();
}
……
}
3.5.4 设置下载重试次数
//设置下载重试次数,默认为0,可设置区间[0, 100]
setReconnectLimit(int reconnectLimit)
3.5.5 设置超时时间
//设置网络请求的超时时间,区间[5000-30000],单位为ms,默认值为10000ms
setTimeOut(int timeOut)
3.6 音频支持
SDK音频播放由DWMediaPlayer类实现,DWMediaPlayer继承了Android的媒体播放器MediaPlayer类,并重载其prepare()和prepareAsync()方法。
3.6.1 音频在线播放
目前播放器默认支持的为视频播放,想要进行音频播放,在prepareAsync()之前则需要如下设置:
player.setDefaultPlayMode(MediaMode.AUDIO, onPlayModeListener);
player.setAudioPlay(true);
player.prepareAsync();
如果默认设置的为支持音视频模式,那么从视频切换到音频的方法为如下:
player.reset();
player.setAudioPlay(true)
player.prepareAsync();
注:onPlayModeListener的回调返回该视频节点信息支持的播放模式。如果没有节点信息,onPlayModeListener的回调返回为null。
3.6.2 音频本地播放
参考章节3.3.2
3.6.3 音频下载
参考3.5。 下载前需要调用setDownloadMode(MediaMode downloadMode)来设置下载的模式。