首页 > 代码库 > 手机端的音视频监控系统开发

手机端的音视频监控系统开发

     网络信息化的趋势,随着流媒体技术、无线网络技术以及视频压缩技术的不断进步,视频监控技术得到了广泛的应用,同时,监控的规模和范围也在不断的扩大。人们对于安全保障的要求不断的提高,从而使得过去以图文为主的内容服务应经不能够满足用户的需求,取而代之的则是音视频多媒体服务。使用移动终端技术的视频监控系统,不仅具有体积小型化、安装傻瓜化以及配置灵活化的优势,最重要的是还降低了成本。由于网络功能和视频压缩都被集中的保存在小体积的设备中,因此,通过网络远程监控视频设备就可以获得监控视频。目前,网络视频监控不仅面向企业级客户,逐渐的,也通过视频监控为大众提供服务。如旅游景点人流、景点查看、交通导航等。基于开放平台的移动视频监控已经成为监控研究领域的热点
  视频监控系统需要的传输数据分为两类:控制信息和视频数据。尽管两类数据进行传输的时候都是基于IP协议进行的,但是,他们分别采取了应用层协议和传输层协议,这是由于两者的特性要求和实现软件的规模不同引起的[3]:第一,采用TCP传输层协议进行信息控制。之所以采用TCP/IP的传输模式进行信息控制,这是由于控制信息虽然不要求较高的实时性,但是对于传输的可靠性要求却十分高。因此,采用了有严格握手过程和重传机制的TCP传输层协议。第二,传输视频数据时,采用RTP应用层协议和UDP传输层协议。由于网络视频的时效性要求远远高于可靠性,因此,本文采用了RTP应用层的传输协议支持实时传输服务。在传输层,虽然UDP尽量采用交付方式进行出数据传输,但是却没有拥塞控制,从而对于大数据量的实时视频数据比较适合此方式,因此,本论文采用UDP协议作为传输层协议。接收到上层应用程序的多媒体信息码流后,经过RTP装配成数据包发送给下层,然后在通过UDP/IP协议封装后形成RTP流。传输控制子系统是基于RTP协议构建的,通过传输层通信使用的UDPSocket完成。 
  在PC机上完成了对视频监控系统应用程序的开发,主要采用图片接收方式来实现移动平台的智能视频监控系统。 

服务器端的功能主要是初始化摄像头和网络端口号以及主机地址,开启视频监控服务,实时捕捉监控现场图像然后等待客户端的连接请求[4]。与远程请求的手机客户端成功建立连接后,便开始向客户端发送视频图像信息。服务器端的设计流程图如图2所示。负责现场监控的Pc服务器端,需要对监控设备进行初始化控制,采用Visual Studio编程环境下的c++/MFC语言来实现。在进行网络通信传输时,系统是基于RTP协议构建的,通过传输层通信使用的UDPSocket来实现服务器端和客户端之间的通信,以实现图像稳定传输。Socket通信的部分通过MFC语言中的CSocket类来实现,而摄像头图像采集和控制则利用相应服务厂商提供的SDK进行实现。视频的捕获中,设计了CCaptureVideo类,并将其实现,通过对打开视频响应函数中该类的调用来实现对视频的捕捉。在处理捕获的视频图像时,将捕获的视频图像转换成连续的JPEG格式的图像存储在数据缓冲区中,该线程不停地接受客户端的连接请求,将图像发送给客户端。 
  该视频监控系统的客户端主要通过TCP/IP协议和服务器端进行实施通信的,同时利用Socket实现整个过程。作为通信链句柄的Socket网络通信套接字用于描述端口和IP地址。通过Socket编程,应用程序会向网络发出请求或应答网络请求。Socket作为通信的基石,支持TCP/IP协议的网络通信的基本操作单元。本程序中使用的Socket传输模式,是面向连接的Socket操作使用TCP协议。Socket在该模式下,必须在客户端和服务端建立Socket连接,一旦建立好连接,便可以在一个流接口进行打开、读、写以及关闭等操作,而另一端则以相同的顺序接受所有的信息。相比无连接而言,虽然面向连接的操作效率较低,但数据却具有更高的安全性。基于Android视频服务器系统终端,必须通过采用Socket网络通信技术接受来自监控前端的视频数据。Socket通信使得监控前端和终端,通过网络连接实现数据的交互。Socket连接初始化后才能进行Socket通信,其实现过程与面向连接的Socket通信相同。创建Socket服务线程,当产生监听后,服务主进程负责不断循环的监听接收到的请求,同时建立新的客户连接Socket,创建针对此Socket的通信进程。在视频监控系统中创建Socket的过程,首先用ServerSocket serverSocket=null在服务器端创建一个Socket,然后用serverSocket=newServerSocket(8888)监听端口8888。如果在该端口接收到客户端Socket的请求,则用Socket client=serverSocket.accept()来创建一个Socket对象。建立连接后,调用InputStreamReader来接收服务器端发送的视频数据,然后通过BufferedReader将此数据读取出来。服务器从前端采集系统接收的数据通过BufferedWriter写入,并通过OutputStreamWriter发送给网络客户端。通信完毕之后,通过os.close()、is.close()和socket.close()来关闭输出输入流并关闭Socket端口,服务器停止Socket通信。网络客户端终端作为接收数据的客户端,首先用Socket socket=null在终端创建一个Socket,然后设置Socket通信的服务器的IP地址和通信端口socket=new Socket("192.168.1.101",8888),成功与服务器建立连接后,用InputStreamReader创建输入流,之后通过BufferedReader读取出来,进行解析并显示在用户端界面上,数据接收完毕后,通过BufferedWriter写入接收完毕信息并通过OutputStreamWriter发送至服务器,通信完毕后,通过os.close()、is.close()、socket.close()关闭输入输出流,并关闭Socket端口,至此整个Socket通信完成。 
  由于服务器发送的是解码后的图片数据,因而客户端接收到的数据流可以组成一幅图片[5-6]。通过Android提供的BitmapFactory.decodeByteAllrayO函数,可以从接收到的数据流中得到Bitmap格式的对象。后文的处理皆针对此Bitmap对象进行。 
  为了实现监控画面的显示,需继承View类,重写了onDraw()方法。其中,在onDraw()方法中所实现的内容,将在客户端界面上显示出来。定义一个Bitmap对象,此对象将在画布中绘制出来。当负责接收图片的线程接收到新的图片数据时,将数据传给该对象,并在线程中调用postlnvalidate0方法,重绘画面。为了系统实现更好的显示效果,本设计采用了双缓存机制。显示的画面存储在原先对象中,而接收的画面存储在变量另一对象中。如果网络状况不好,并不能及时接收到新的数据,使得另一对象为空,则原先的变量不更新,还将显示之前的画面,这样处理将在一定程度上提高用户体验,减少网络状况不好情况下的突发性黑屏。 
  根据Android的GUI系统,能够实现远程视频实时监视的用户界面,并提供播放器和用户之间的交互接口。Java和C语言框架共同组成了GUI系统,此系统对下层通过调用显示输入、输出设备的驱动,将Android的软件系统和底层的硬件联系起来;此系统对于上层提供了Java层次的绘图接口,Android的Java框架层调用这些接口来构建各种UI元素。此外,Java也可以调用绘图接口。 

手机端的音视频监控系统开发