Android-再次解读萤石云视频
### 前言
我之前写过一篇萤石云的集成文章,很多人问我有没有demo, 今天我再次总结一下, 并加个些功能。
- 集成步骤
- 视频预览播放
- 视频放大缩小
- 视频的质量切换
- 截图
- 视频加载细节
之前的文章大家可以看下面的链接:
https://mp.weixin.qq.com/s/V4F2_bkY8QFN167KY9gSDg
先看效果图:

### 集成步骤
###### 1.安装SDK
```
dependencies {
compile 'com.hikvision.ezviz:ezviz-sdk:4.8.6.2'
}
```
###### 2.配置工程
(1).权限配置
在 AndroidMainfest.xml 文件中添加:
```
//网络权限
//存储权限
//wifi 状态权限
//热点配网扫描wifi需要使用
```
(2).配置build.gradle
```
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a"//只支持v7a
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
```
(3).配置 AndroidManifest.xml
添加如下activity定义,用于sdk中间页显示,包含登录、开通云存储等。
```
```
具体可以参考官方集成网站
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;
}
```
```
```
实现Handler.Callback,来监听播放结果回调:
```
@Override
public boolean handleMessage(Message msg) {
switch (msg.what){
}
return false;
}
```
配置:
```
//用来存储萤石云的播放质量、序列号
mCameraInfo=new EZCameraInfo();
// 2-高清,1-标清,0-流畅
mCameraInfo.setVideoLevel(2);
//序列号
mCameraInfo.setDeviceSerial("C86398971");
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;
}
```
### 视频质量切换
效果图:

核心方法
```
// 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()
```
需要**源码**的朋友可以加我的微信:lengquele5311

大家可以关注我的微信公众号:「秦子帅」一个有质量、有态度的公众号!

Android-再次解读萤石云视频的更多相关文章
- vue接入萤石云视频
在萤石云开放平台注册开发者账号,网址:https://open.ys7.com/guide.html 在“开发者服务”-->“我的设备”里添加已有设备或者申请一个试用设备 然后点击“我的应用”里 ...
- 基于EasyDarwin云视频平台的幼儿园视频直播(手机直播/微信直播)解决方案
一.方案介绍 1.1.方案背景 在2016年10月25日至28日的安博会上,我们看到了不少的幼教平台厂商,我们注意到大部分的幼教平台,为了追求极佳的用户体验,在微信或者APP端能够做到极快的打开速度, ...
- Atitit.android播放smb 网络邻居视频文件解决方案
Atitit.android播放smb 网络邻居视频文件解决方案 Android4.4 1.1. Android4视频播放器不能直接地支持smb协议..子好先转换成个http流 1.2. ES文件浏览 ...
- 本人讲课时录制的Android应用开发技术教学视频
网盘地址:http://yun.baidu.com/pcloud/album/info?query_uk=1963923831&album_id=3523786484935252365 本人讲 ...
- ZEALER背后的乐视云视频
ZEALER是我非常喜欢的一个测评网站,经常访问看看手机.电动牙刷及机械键盘的测试视频,非常欣赏王自如的数据化测评理念.敬畏之心,以及不祛痘的视频. 刚好最近对网络视频应用比较感兴趣,觉得ZEALER ...
- Android SurfaceView + MediaPlayer实现分段视频无缝播放
Android当中实现视频播放的方式有两种,即:通过VideoView实现或者通过SurfaceView + MediaPlayer实现. 由浅至深,首先来看下想要在Android上播放一段视频,我们 ...
- PC电脑运行Android模拟器总是弹出“视频源”窗体的原因和解决方案
原因: PC电脑运行Android模拟器时弹出“视频源”窗体,会让你"选择视频设备",如:HP TruevIsion HD,而这个视频设备就是你电脑中的内置摄像头,这个内置摄像头在 ...
- android 播放assets文件里视频文件的问题
今天做了一个功能,就是播放项目工程里面的视频文件,不是播放SD卡视频文件. 因为之前写webview加载assets文件夹时,是这样写的: webView = new WebView(this); w ...
- 阿里云视频直播PHP-SDK
阿里云 视频直播 配置 及 PHP-SDK 接入教程准备工作域名管理配置鉴权地址生成器及DEMO演示-熟悉鉴权接入SDK推流回调的配置阿里云 视频直播 配置 及 PHP-SDK 接入教程 个人感觉,阿 ...
随机推荐
- 实现一个简单的散列表(HashMap)
下面参考java.util.HashMap<K, V>,写了一个简单的散列表,只实现了其中的put和get方法,使用链接法"碰撞冲突".代码最后,自定义了一个Peopl ...
- C++fread小解
std::fread ——C++ 输入/输出库 C 风格 I/O 定义于头文件 <cstdio> std::size_t fread( void* buffer, std::size_t ...
- 用C语言开发的19个经典项目,你会第几个?
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:实验楼 C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多 ...
- 笔记||Python3之文件的读写
[文件的读模式] 文件的对象:文件的读写通过文件操作对象进行. Python2 ----- File Python3 ----- TextIOWrapper ...
- vue 组件传递值以及获取DOM元素的位置信息
1.父组件 select_li.vue 1.1 父组件模板 <template> <div id='selectLi' ref="selectLi"> &l ...
- eclipse新建maven项目报错Could not resolve arachetype org.apache.maven.archetypes:mmaven-archetype-quickstart:1.1 from any of the configured repositories
使用eclipse新建maven项目,按下图所示选择后,报错 报错截图 报错详细信息 Could not resolve archetype org.apache.maven.archetypes:m ...
- JS 判断移动端 ,跳转
function SetPlatForm() { var JumpUrl = ""; var sUserAgent = navigator.userAgent.toLowerCas ...
- Servlet还有学习的必要吗?(手工搭建Servlet)
前言 在初学Java web的时候,就曾听到过这样一种说法: java Web的演变过程大概可以分为4个阶段: jsp + Servlet + jdbc spring + struts2+ hiber ...
- textarea增加字数监听且高度自适应(兼容IE8)
1.封装方法: var textareaListener = { /*事件监听器兼容 * *attachEvent——兼容:IE7.IE8:不兼容firefox.chrome.IE9.IE10.IE1 ...
- Spring Boot 如何自定义返回错误码错误信息
说明 在实际的开发过程中,很多时候要定义符合自己业务的错误码和错误信息,而不是统一的而不是统一的下面这种格式返回到调用端 INTERNAL_SERVER_ERROR(500, "Intern ...