螢石雲視訊EZOpenSDK整合(實現播放,視訊放大功能)

秦子帥發表於2017-09-27

推薦閱讀:
SurfaceView+MediaPlayer封裝之路
Android學習資源分享合集(1)

去年在專案中用到了螢石雲視訊,它的專案原始碼很多,找到有用的程式碼很費時間,所以今天寫成文章把整合步驟,預覽功能,雙擊放大,手勢放大功能以及注意事項等分享給大家。
效果圖如下:

螢石開發平臺地址:
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();複製程式碼

如果有什麼不清楚的可以加我公眾號或者加微信,希望對大家有所幫助。

相關文章