论文部分内容阅读
由于原本在Windows平台上的用户提出希望能够在移动设备上实时查看监控影像的强烈需求,且目前Android手机平台上网络监控实时影像播放软件由于没有合适的文件解析器而稀缺,因此决定开发本款软件。到目前为止,专业的监控摄像头通常支持采用MJPEG、MPEG-4或者H.264格式来封装影像数据并进行发送。MJPEG格式的数据都是采用了HTTP(Hypertext TransferProtocol)协议进行传输。当摄像头采用MPEG-4格式或是H.264格式封装视频数据时,通常采用RTP(Real-time Transport Protocol)协议进行传输。本文设计开发一款能够在装载了Android系统的手机上实时播放远程监控摄像头所拍摄影像的应用软件。本软件使用JAVA语言实现了对摄像头通过HTTP协议和单播的RTP协议发送的流数据的接收。使用HTTP协议获取到MJPEG流数据后,编写了解析的函数,将MJPEG流数据拆分成单张的JPEG图像数据,然后使用Android自带的JPEG解码库进行了解码。虽然监控摄像头使用的编码格式都是相对使用较为广泛的视频标准,但是由于实时的视频流数据都是一边获取一边发送的,因此没有文件的长度值,这点与存储在磁盘上的视频文件不同。由此造成播放MPEG-4和H.264的流数据时在文件解析的部分就无法成功,导致无法正常播放。本软件使用C语言封装了对MPEG-4数据流的解析以及解码库的调用接口,使用JAVA语言实现了针对摄像头发送的H.264格式的TS(TransportStream)流的解析工作:从视音频混合的TS流中剥离出视频数据并解析成H.264格式解码所需的NAL(Network Abstraction Layer)单元后通过JNI(Java Native Interface)送入解码库进行解码。目前大部分的手机不能直接对摄像头捕获的实时视频流进行解码的原因就在于没有对应的文件解析器。监控图像的播放还需要确保图像数据的正确性以及在时间上的实时性,这两者之间存在着相互影响的因素。对于这个准确性的控制本文采用丢帧管理机制来完成。由于网络传输环境复杂,会发生数据包丢失的情况,数据包的丢失将会导致图像解码发生错误,一旦检测发现这种情况,就需要将与之相关的数据一同丢弃。由于监控影像还需要确保显示图像与摄像头捕获图像之间的时间差不能太大。由于设备的软件或者硬件的性能以及网络传输能力的限制导致不得不丢弃某些来不及处理的数据,本文设计使用三个位于不同线程的缓冲区对主动丢帧和被动丢帧的情况采取控制,防止由于丢帧产生的解码错误。此外,还结合了手势识别和多点触摸的功能实现了从手机端控制远端摄像头动作的功能。由于不同厂家设计的摄像头的API(Application Programming Interface)不同,会造成开发出的应用程序的兼容性差,无法形成产品。本软件采用定义外部标准配置文件来解决这一问题。