前言
去年在项目中用到了萤石云视频,它的项目源码很多,找到有用的代码很费时间,所以今天写成文章把集成步骤,预览功能,双击放大,手势放大功能以及注意事项等分享给大家。
效果图如下:
萤石开发平台地址:
https://open.ys7.com/
点击"文档"进入萤石云开发平台开发文档使用。
集成步骤
1. 创建应用
首先,你需要在萤石开放平台官网的 “ 开发者服务-我的应用-应用秘钥 ” 查看Appkey。
2.安装 SDK
dependencies {
compile 'com.hikvision.ezviz:ezviz-sdk:4.5.1'
}
3. 配置 Android 权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
4. 配置 build.gradle
defaultConfig {
...
targetSdkVersion 22//小于23
...
ndk {
abiFilters "armeabi-v7a"//只支持32位
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
注意:
(1).目前提供所有so均为32位,只能在armeabi-v7a引用,所以需要添加
ndk {
abiFilters "armeabi-v7a"//只支持32位
}
(2).targetSdkVersion设置为23及以上,在android6.0系统的手机上会出现没有权限崩溃的情况,因为android6.0牵扯到Dangerous Permissions问题,如果需要使用高版本,需要自己处理Dangerous Permissions。
5. 配置 AndroidManifest.xml
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden"
android:exported="false" >
filter>
6.代码初始化
要在Application中初始化
/**
* APP_KEY请替换成自己申请的
*/
EZOpenSDK.initLib(this, APP_KEY, "");
代码混淆直接去看开发文档,这里就省略了。
7.重要名词解释:
初始化流程
1.初始化SDK-initLib,也就是在Application。
EZOpenSDK.initLib(this, APP_KEY,"");
2.获取AccessToken.
EZOpenSDK.getInstance().setAccessToken("您要填的Token值");
3.您购买的摄像机设备添加在萤石云APP上。(直接在下载APP通过序列号添加)
如果您开发中还要获取设计列表等等的功能请直接查看萤石云开发平台文档。
初播放视频流程
播放流程:
1.初始化EZPlayer调用EZOpenSDK的createPlayer,详见api;
2.预览播放成功后可以进行以下操作:录像、拍照、画面翻转、对讲、云台控制、声音开关、视频画面缩放、拖动进度播放,详见api的EZPlayer,其中设备控制该接口的如云台控制和镜头显示功能、对讲,属于限制级接口,要优选通过判断设备的能力集来调用,设备能力集请查看EZDeviceInfo对象的属性值来判断具体方法;
3.关于对讲功能,如果预览播放有声音输出,则在开启对讲前需要关闭预览播放的声音closeSound,关闭对讲后开启预览播放的声音openSound,详见demo;
4.EZOpenSDK中的setVideoLevel设置视频清晰度(videoLevel),此调节可以在视频播放前设置也可以在视频播放成功后设置,视频播放成功后设置了清晰度需要先停止播放stopRealPlay然后重新开启播放startRealPlay才能生效;
5.开始播放之后在消息回调中会收到a、成功消息:EZRealPlayConstants.MSG_REALPLAY_PLAY_SUCCESS,b、失败消息:EZRealPlayConstants.MSG_REALPLAY_PLAY_FAIL,失败回调时查看errorCode,如果为400035(需要输入验证码)和400036(验证码错误),则需要开发者自己处理让用户重新输入验证密码,并调用setPlayVerifyCode设置密码,然后重新启动播放。
实现代码:
布局主要控件是SurfaceView,SurfaceView的用法大家应该都知道吧,主要实现了implements SurfaceHolder.Callback接口,声明SurfaceView 对象,并实方法,代码如下:
private SurfaceView mRealPlaySv = null;
private SurfaceHolder mRealPlaySh = null;
mRealPlaySh = mRealPlaySv.getHolder();
mRealPlaySh.addCallback(VideoActivity.this);
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (mEZPlayer != null) {
mEZPlayer.setSurfaceHold(holder);
} else {
}
mRealPlaySh = holder;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mEZPlayer != null) {
mEZPlayer.setSurfaceHold(null);
}
mRealPlaySh = null;
}
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="@android:color/transparent" />
1.初始化EZPlayer,绑定设备,开始播放。
mEZPlayer = YourApplication.getOpenSDK().createPlayer(deviceSerial, cameraNo);//绑定设备
mEZPlayer.setHandler(mHandler);
mEZPlayer.setSurfaceHold(mRealPlaySh);
mEZPlayer.startRealPlay();//开始播放
2.播放回调
/*
视频的回调
*/
@Override
public boolean handleMessage(Message msg) {
// Log.e("回调","true+zong"+msg);
switch (msg.what) {
//播放成功的回调
case EZConstants.EZRealPlayConstants.MSG_REALPLAY_PLAY_SUCCESS:
break;
}
return false;
}
视频放大、手势放大功能
在播放成功的回调里加上 setRealPlaySvLayout();方法,方法的代码如下:
private void setRealPlaySvLayout() throws InnerException, PlaySDKException {
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int whdth = dm.widthPixels;
int height = dm.heightPixels;
mRealPlayTouchListener.setSacaleRect(Constant.MAX_SCALE, 0, 0, whdth, height);
setPlayScaleUI(1, null, null);
}
private void setPlayScaleUI(float scale, CustomRect oRect, CustomRect curRect) {
if (scale == 1) {
try {
if (mEZPlayer != null) {
mEZPlayer.setDisplayRegion(false, null, null);
}
} catch (BaseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
if (mPlayScale == scale) {
try {
if (mEZPlayer != null) {
mEZPlayer.setDisplayRegion(true, oRect, curRect);
}
} catch (BaseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
try {
if (mEZPlayer != null) {
mEZPlayer.setDisplayRegion(true, oRect, curRect);
}
} catch (BaseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mPlayScale = scale;
}
强调
1.必须在onDestory()方法上注销,否则会报错,代码如下:
@Override
protected void onDestroy() {
super.onDestroy();
if (mEZPlayer != null) {
mEZPlayer.release();
}
}
2.暂停播放的方法
mEZPlayer.stopRealPlay();
如果有什么不清楚的可以给我留言或者加微信,希望对大家有所帮助。