• 开源流媒体客户端EasyClient手机端控制摄像机EasyCamera云台PTZ控制实现


    本文转自EasyDarwin开源团队成员kim的博客:http://blog.csdn.net/jinlong0603/article/details/51835308


    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
    1. enum ControlType{  
    2.     TYPE_SINGLE("single"),  
    3.     TYPE_CONTINUE("continuous");  
    4.     private String des;  
    5.   
    6.     private ControlType(String string) {  
    7.         des=string;  
    8.     }  
    9.   
    10.     public String GetDes() {  
    11.         return des;  
    12.     }  
    13. }  
    14.   
    15. enum ControlCmd{  
    16.     CMD_MOVESTOP("stop"),  
    17.     CMD_MOVEUP("up"),  
    18.     CMD_MOVEDOWN("down"),  
    19.     CMD_MOVELEFT("left"),  
    20.     CMD_MOVERIGHT("right"),  
    21.     CMD_ZOMEIN("zoomin"),  
    22.     CMD_ZOMEOUT("zoomout");  
    23.     private String des;  
    24.   
    25.     private ControlCmd(String string) {  
    26.         des=string;  
    27.     }  
    28.   
    29.     public String GetDes() {  
    30.         return des;  
    31.     }  
    32. }  


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

    [java] view plain copy
    1. @Override  
    2.     public boolean onTouch(View v, MotionEvent event) {  
    3.         if(TextUtils.isEmpty(mDevSerial)){  
    4.             return true;  
    5.         }  
    6.   
    7.         switch (event.getAction()){  
    8.             case MotionEvent.ACTION_DOWN:  
    9.                 switch (v.getId()){  
    10.                     case R.id.btMoveUp:  
    11.                         sendControlCommand(ControlCmd.CMD_MOVEUP, ControlType.TYPE_CONTINUE);  
    12.                         break;  
    13.                     case R.id.btMoveDown:  
    14.                         sendControlCommand(ControlCmd.CMD_MOVEDOWN, ControlType.TYPE_CONTINUE);  
    15.                         break;  
    16.                     case R.id.btMoveLeft:  
    17.                         sendControlCommand(ControlCmd.CMD_MOVELEFT, ControlType.TYPE_CONTINUE);  
    18.                         break;  
    19.                     case R.id.btMoveRight:  
    20.                         sendControlCommand(ControlCmd.CMD_MOVERIGHT, ControlType.TYPE_CONTINUE);  
    21.                         break;  
    22.                 }  
    23.                 break;  
    24.             case MotionEvent.ACTION_UP:  
    25.             case MotionEvent.ACTION_CANCEL:  
    26.                 sendControlCommand(ControlCmd.CMD_MOVESTOP, ControlType.TYPE_CONTINUE);  
    27.                 break;  
    28.             default:  
    29.                 break;  
    30.         }  
    31.   
    32.         return false;  
    33.     }  


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


    获取更多信息

    邮件:support@easydarwin.org

    WEB:www.EasyDarwin.org

    Copyright © EasyDarwin.org 2012-2016

    EasyDarwin


  • 相关阅读:
    IDEA连接Spark集群执行Scala程序
    win10安装mysql,及重装
    python生产和消费kafka数据
    protobuf 协议浅析
    操作系统-第十三章-I/O系统
    操作系统-第十二章-大容量存储结构
    操作系统-第十一章-文件系统的实现
    JSONP跨域提交请求
    标识多个物体并返回物体中心坐标方法的实现
    SkyWalking Agent端日志插件的编写历程与使用说明
  • 原文地址:https://www.cnblogs.com/babosa/p/5904614.html
Copyright © 2020-2023  润新知