android云控开源,Android EasyClient 云台控制开源流媒体摄像机EasyCamera

//用EasyClient开源项目采集Windows摄像头/麦克风的音视频进行RTSP直播

EasyCamera是EasyDarwin开源团队开发的一款植入摄像机内部的嵌入式程序,功能是将普通IP Camera与EasyDarwin流媒体云平台(EasyCMS、EasyDarwin、EasyRMS等云服务器)对接,上传数据、接受指令控制,形成一套云摄像机方案。

EasyCamera目前已经提供了云台控制的功能,大家可以查阅EasyDarwin的协议文档。本文就介绍下Android客户端如何实现对EasyCamera的云台控制。

首先,简单介绍下Android客户端(EasyClient)如何与EasyCamera交互的。EasyClient并不直接与EasyCamera进行通信。EasyCamera开机时会将中心管理服务器(EasyCMS)发送注册请求、发送快照等,并且一直定时发送注册、快照进行保活。EasyCMS记录了所有当前在线的EasyCamera信息。当Android客户端EasyClient打开时,首先会向EasyCMS获取当前在线的EasyCamera列表。EasyClient请求某个Camera视频时,EasyCMS会通知对应的EasyCamera将视频流推送到指定的EasyDarwin服务器上,EasyClient从该EasyDarwin服务器上获取到实时视频流进行播放。

从EasyClient上云台控制EasyCamera,是EasyClient向EasyCMS服务器发送一个请求,内容包括设备序列号、动作等,参见协议文档4.9节。EasyCMS回复MSG_SC_PTZ_CONTROL_ACK给EasyClient后,会将请求内容发送给对应的EasyCamera进行控制。

我定义了两个枚举,枚举了控制类型(单步还是连续),控制动作(上下左右停等)。

[java]  view plain

copy

enumControlType{

TYPE_SINGLE("single"),

TYPE_CONTINUE("continuous");

privateString des;

privateControlType(String string) {

des=string;

}

publicString GetDes() {

returndes;

}

}

enumControlCmd{

CMD_MOVESTOP("stop"),

CMD_MOVEUP("up"),

CMD_MOVEDOWN("down"),

CMD_MOVELEFT("left"),

CMD_MOVERIGHT("right"),

CMD_ZOMEIN("zoomin"),

CMD_ZOMEOUT("zoomout");

privateString des;

privateControlCmd(String string) {

des=string;

}

publicString GetDes() {

returndes;

}

}

在EasyPlayerActivity.java中增加4个按键, 分别为上下左右,并增加OnTouchListener接口,当按键按下时持续转动,释放按键时停止转动。

[java]  view plain

copy

@Override

publicbooleanonTouch(View v, MotionEvent event) {

if(TextUtils.isEmpty(mDevSerial)){

returntrue;

}

switch(event.getAction()){

caseMotionEvent.ACTION_DOWN:

switch(v.getId()){

caseR.id.btMoveUp:

sendControlCommand(ControlCmd.CMD_MOVEUP, ControlType.TYPE_CONTINUE);

break;

caseR.id.btMoveDown:

sendControlCommand(ControlCmd.CMD_MOVEDOWN, ControlType.TYPE_CONTINUE);

break;

caseR.id.btMoveLeft:

sendControlCommand(ControlCmd.CMD_MOVELEFT, ControlType.TYPE_CONTINUE);

break;

caseR.id.btMoveRight:

sendControlCommand(ControlCmd.CMD_MOVERIGHT, ControlType.TYPE_CONTINUE);

break;

}

break;

caseMotionEvent.ACTION_UP:

caseMotionEvent.ACTION_CANCEL:

sendControlCommand(ControlCmd.CMD_MOVESTOP, ControlType.TYPE_CONTINUE);

break;

default:

break;

}

returnfalse;

}

源码参见Github上EasyClient,地址: https://github.com/EasyDarwin/EasyClient