推薦閱讀:
SurfaceView+MediaPlayer封裝之路
Android學習資源分享合集(1)android
去年在項目中用到了螢石雲視頻,它的項目源碼不少,找到有用的代碼很費時間,因此今天寫成文章把集成步驟,預覽功能,雙擊放大,手勢放大功能以及注意事項等分享給你們。
效果圖以下:api
螢石開發平臺地址:
https://open.ys7.com/微信
點擊"文檔"進入螢石雲開發平臺開發文檔使用。ide
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.gradlegradle
defaultConfig { ... targetSdkVersion 22//小於23 ... ndk { abiFilters "armeabi-v7a"//只支持32位 } } sourceSets { main { jniLibs.srcDirs = ['libs'] } }
注意:
(1).目前提供全部so均爲32位,只能在armeabi-v7a引用,因此須要添加ui
ndk { abiFilters "armeabi-v7a"//只支持32位 }
(2).targetSdkVersion設置爲23及以上,在android6.0系統的手機上會出現沒有權限崩潰的狀況,由於android6.0牽扯到Dangerous Permissions問題,若是須要使用高版本,須要本身處理Dangerous Permissions。this
5. 配置 AndroidManifest.xmlspa
<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();
若是有什麼不清楚的能夠加我公衆號或者加微信,但願對你們有所幫助。