萤石云视频 EZOpenSDK 集成(实现播放,视频放大功能)

2018-05-30 16:07:39 +08:00
 qzs

去年在项目中用到了萤石云视频,它的项目源码很多,找到有用的代码很费时间,所以今天写成文章把集成步骤,预览功能,双击放大,手势放大功能以及注意事项等分享给大家。 效果图如下:

萤石开发平台地址: 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

<activity
        android:name="com.videogo.main.EzvizWebViewActivity"
        android:screenOrientation="portrait"
        android:configChanges="orientation|keyboardHidden"
    </activity>

 <receiver
       android:name="you_BroadcastReceiver"
       android:exported="false" >
       <intent-filter>
            <action android:name="com.videogo.action.OAUTH_SUCCESS_ACTION" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
   </receiver>

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;

}
<SurfaceView
    android:id="@+id/realplay_sv"
    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();

欢迎关注我的微信公众号 [秦子帅] ,带你一起了解 Android、Python、Java 技术

4870 次点击
所在节点    Android
2 条回复
nine99
2018-05-30 17:20:23 +08:00
最近做公众号的真多
qzs
2018-05-31 21:20:43 +08:00
@nine99 我去年做的,嗯今年发现做公众号的很多,哎

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/458980

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX