Android-再次解读萤石云视频

前言

我之前写过一篇萤石云的集成文章,很多人问我有没有demo, 今天我再次总结一下, 并加个些功能。


  • 集成步骤

  • 视频预览播放

  • 视频放大缩小

  • 视频的质量切换

  • 截图


之前的文章大家可以看下面的链接:

https://mp.weixin.qq.com/s/V4F2_bkY8QFN167KY9gSDg


效果图:(因为压缩的缘故,请忽略图片质量)


640?wx_fmt=gif


集成步骤

1.安装SDK

 
 
 
 
dependencies {	
 compile 'com.hikvision.ezviz:ezviz-sdk:4.8.6.2'	
 }


2.配置工程

(1).权限配置

在 AndroidMainfest.xml 文件中添加:

 
 
 
 
//网络权限	
<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.WRITE_EXTERNAL_STORAGE"/>	
	
//wifi 状态权限	
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>	
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>	
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>	
//热点配网扫描wifi需要使用	
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>


(2).配置build.gradle

 
 
 
 
defaultConfig {	
 ...	
 ndk {	
 abiFilters "armeabi-v7a"//只支持v7a	
 }	
 }	
 sourceSets {	
 main {	
 jniLibs.srcDirs = ['libs']	
 }	
 }


(3).配置 AndroidManifest.xml

添加如下activity定义,用于sdk中间页显示,包含登录、开通云存储等。

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


具体可以参考官方集成网站

https://open.ys7.com/doc/zh/book/4.x/android-sdk.html


视频预览播放

播放与之前版本不同,加入设备的验证码

 
 

mEZPlayer.setPlayVerifyCode("验证码");


(1).SDK初始化(在application中初始化)

 
 
 
 
/** * sdk日志开关,正式发布需要去掉 */	
EZOpenSDK.showSDKLog(true);	
/** * 设置是否支持P2P取流,详见api */	
EZOpenSDK.enableP2P(false);	
	
/** * APP_KEY请替换成自己申请的 */	
EZOpenSDK.initLib(this, APP_KEY);


(2).播放主要代码

实现代码:

设置token

 
 
 
 
EZOpenSDK.getInstance().setAccessToken("你的token");


布局主要控件是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" />


实现Handler.Callback,来监听播放结果回调:

 
 
@Override	
 public boolean handleMessage(Message msg) {	
 switch (msg.what){	
 }	
 return false;	
 }

配置播放质量与序列号等:

 
 
 
 
//用来存储萤石云的播放质量、序列号	
 mCameraInfo=new EZCameraInfo();	
 // 2-高清,1-标清,0-流畅	
 mCameraInfo.setVideoLevel(2);	
 //序列号	
 mCameraInfo.setDeviceSerial("你的设备序列号");	
 mCameraInfo.setCameraNo(1);


开始播放:

 
 
 
 
private void startRealPlay() {	
 	
 mEZPlayer = YourApplication.getOpenSDK().createPlayer(mCameraInfo.getDeviceSerial(), mCameraInfo.getCameraNo());	
 	
 mEZPlayer.setPlayVerifyCode(mVerificationCode);	
 mEZPlayer.setHandler(mHandler);	
 mEZPlayer.setSurfaceHold(mRealPlaySh);	
 mEZPlayer.startRealPlay();	
 tvPlay.setEnabled(true);	
 }


视频放大缩小

在播放成功的回调里加上 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;	
}


视频质量切换


效果图:

640?wx_fmt=gif


核心方法

 
 

// 2-高清,1-标清,0-流畅
mCameraInfo.setVideoLevel


切换画面

 
 
 
 
/**	
 * 码流配置 清晰度 2-高清,1-标清,0-流畅	
 *	
 * @see	
 * @since V2.0	
 */	
 private void setQualityMode(final EZConstants.EZVideoLevel mode) {	
	
 if (mEZPlayer != null) {	
	
 mWaitDialog.setWaitText("正在设置画面质量…");	
 mWaitDialog.show();	
	
 Thread thr = new Thread(new Runnable() {	
 @Override	
 public void run() {	
 try {	
 // need to modify by yudan at 08-11	
 APP.getOpenSDK().setVideoLevel(mCameraInfo.getDeviceSerial(), mCameraInfo.getCameraNo(), mode.getVideoLevel());	
 mCurrentQulityMode = mode;	
 Message msg = Message.obtain();	
 msg.what = MSG_SET_VEDIOMODE_SUCCESS;	
 mHandler.sendMessage(msg);	
 } catch (BaseException e) {	
 mCurrentQulityMode = EZConstants.EZVideoLevel.VIDEO_LEVEL_FLUNET;	
 e.printStackTrace();	
 Message msg = Message.obtain();	
 msg.what = MSG_SET_VEDIOMODE_FAIL;	
 mHandler.sendMessage(msg);	
 }	
	
 }	
 }) {	
 };	
 thr.start();	
 }	
 }


切换画质结果:

 
 
 
 
//切换画质成功	
 case EZConstants.EZRealPlayConstants.MSG_SET_VEDIOMODE_SUCCESS:	
 handleSetVedioModeSuccess();	
 break;	
 //切换画质失败	
 case EZConstants.EZRealPlayConstants.MSG_SET_VEDIOMODE_FAIL:	
 handleSetVedioModeFail(msg.arg1);	
 break;


其他

 1.声音开关:

 
 

mLocalInfo.setSoundOpen(false);


2.截图:

 
 

mEZPlayer.capturePicture()


源码

链接:

https://pan.baidu.com/s/19DtUC3kAhXk5NjKGv5CnGA

提取码:navl


推荐阅读

视频播放技术汇总(列表播放,小窗播放,跨界面播放,播放中网络切换提示)


640?wx_fmt=jpeg

效率、成本

这两样你都得拥有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值