V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qzs
V2EX  ›  Android

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

  •  
  •   qzs · 2018-05-30 16:07:39 +08:00 · 4617 次点击
    这是一个创建于 2150 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    2 条回复    2018-05-31 21:20:43 +08:00
    nine99
        1
    nine99  
       2018-05-30 17:20:23 +08:00
    最近做公众号的真多
    qzs
        2
    qzs  
    OP
       2018-05-31 21:20:43 +08:00
    @nine99 我去年做的,嗯今年发现做公众号的很多,哎
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1234 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:27 · PVG 07:27 · LAX 16:27 · JFK 19:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.