摘 要: 设计并实现了基于嵌入式Linux和TSM320DM365处理器平台的实时视频监控系统终端。首先介绍了视频监控系统的总体框架,从可扩展性以及实用性上设计了嵌入式终端软件的总体框架;接着阐述了终端软件上音视频采集发送模块的设计与实现方案;最后对该嵌入式终端进行测试,验证其实际效果。
0 引言
随着嵌入式技术、图像处理技术、网络通信技术的不断发展以及人们的安防意识日益提高,通过实时视频传输系统对现场监控的应用越来越广泛。基于ARM的视频监控系统因其体积小、功能强、功耗低、性价比高等特点,被广泛地应用在交通道路、学校、小区、机场等场所。因此,对基于嵌入式的网络监控系统终端的研究具有很重要的社会和实际应用价值[1]。本文根据实际需求,设计并实现了基于DM365的网络视频监控系统终端,它是网络视频监控系统中的音视频获取源,集成了音视频采集编码、语音解码播放、实时传输和信令控制等功能。本文主要阐述了终端系统软件框架的设计与主要功能模块的实现。
1 系统结构介绍
整个视频监控系统[2]由三部分组成:嵌入式终端、服务器平台和客户端。系统结构框架如图1所示。
嵌入式终端负责采集音视频数据,对音视频数据进行压缩编码,并将编码压缩数据通过3G/WLAN网发送至流媒体服务器。服务器平台由流媒体服务器、SIP信令服务器和FTP服务器三部分组成。流媒体服务器负责转发音视频流,SIP信令服务器负责终端与平台、终端与客户端之间的信息交互,FTP服务器负责图像文件信息的存储备份。客户端主要实现实时监控和终端控制功能,通过客户端可对终端设备进行实时的视频码率帧率控制。整个系统为嵌入式视频监控提供了良好的解决方案,能够广泛地应用在视频监控领域中。
2 嵌入式终端软件框架设计
嵌入式终端软件开发基于MontaVista Linux嵌入式操作系统,它基于Linux内核,具有高效、实时、稳定、内核可裁剪等特点[3]。同时利用Linux系统提供的进程间通信机制可方便地实现各功能模块之间的数据通信。嵌入式终端软件平台包括视频采集编码模块、音频采集编码解码模块、RTP模块、信令控制模块以及其他的功能模块等。终端软件总体框架如图2所示。
SIP信令模块负责与服务器平台的信令交互。信令模块将应用管理模块的信息进行SIP信令封装并发送至SIP服务器;同时解析接收的SIP信令,将控制信息通过本地socket发送至应用管理模块进行调度。
应用管理模块负责调度各个功能模块。管理模块收集各个功能模块的交互信息,将交互信息进行封装,发送至SIP信令控制模块,从而实现与服务器平台的信令交互;与此同时,管理模块还将接收到的控制信息进行解析,根据控制信息调度相应的功能模块。在各功能模块中,RTP模块为主要模块,负责音视频数据的RTP封包、发送。
音视频采集模块负责实时的音视频数据采集。该模块采集音视频数据,并对其进行编码,通过Linux共享内存机制实现与RTP模块的数据交互。
该软件框架中各功能模块单独实现,互不影响,可根据具体需求方便地添加和删除功能模块,同时各个模块均由应用管理模块进行调度统筹,便于管理。
3 音视频功能模块的设计与实现
嵌入式设备作为视频监控系统的终端,需要完成语音与视频的数据采集和发送,一次成功的视频监控请求应当包含控制信息接收解析、数据流的发送和接收等。嵌入式终端音视频功能模块主要包括音视频采集编码模块、RTP模块,模块间通过Linux进程间通信机制实现数据与控制信息的交互。
图3所示为一次音视频请求后音视频相关模块的处理流程。客户端发起视频请求后,SIP信令模块将接收到服务器转发的视频请求信令,SIP信令在经过信令模块的解析之后,其携带的控制消息将到达应用管理模块;管理模块解析音视频请求控制消息,通知RTP模块;RTP模块开启两个线程用于处理音视频数据,发送线程负责从共享内存读取音视频数据并进行RTP打包发送,接收线程接收流媒体服务器转发的语音数据包并进行解码播放。
本文选用TI公司采用达芬奇技术的数字媒体处理器TMS320DM365作为主芯片。为了方便音视频采集编码的应用程序开发,TI针对达芬奇平台提供了达芬奇多媒体应用程序接口(Davinci Multimedia Application Interface,DMAI),DMAI封装了底层的驱动,并且提供了易于程序开发的编程接口[4]。这使得应用程序不再关心底层硬件对于某个操作的具体实现,大大简化了应用程序的开发。本文音视频采集编码模块的大部分就是调用DMAI接口实现的。
3.1 视频采集编码模块实现
嵌入式终端接收到视频请求信令之后,视频采集编码模块进行视频数据的采集,将采集的视频数据进行H.264编码,写入共享内存,供RTP模块读取。视频采集模块采用多线程工作机制[5],主线程负责整个流程控制,视频采集编码的具体实现在Capture线程、Video线程和Write线程中完成,三个线程通过管道进行线程间通信。
Capture线程负责采集原始视频数据,关键代码如下:
hCapture=Capture_create(hBufTab,&cAttrs)
//创建一个视频采集设备实例
Capture_get(hCapture,&hCapBuf)
//从视频采集设备获取采集到的一帧原始数据
Fifo_put(envp->hOutFifo,hBuf)//将存有原始数据的
//缓冲指针写入hOutFifo管道中,供video线程读取
Fifo_get(envp->hInFifo,&hDstBuf)
//从hInFifo管道读取由Video线程写回的缓存指针
Capture(hCapture,hCapBuf)//告知hCapture,Capture
//线程已经完成一次操作,等待hCapture句柄再次捕获
//一帧原始数据
Video线程负责对采集的原始视频数据进行H.264编码,关键代码如下:
hVe1=Venc1_create(hEngine,envp->videoEncoder,params,dynParams)//创建H.264视频编码器
Fifo_get(envp->hCaptureOutFifo,&hCapBuf)
//从管道读取存有原始数据的缓冲指针
Fifo_get(envp->hWriterOutFifo,&hDstBuf)
//从管道读取Write线程写入的缓冲指针
Venc1_process(hVe1,hCapture,hDstBuf)
//将一帧原始视频数据进行H.264编码
Fifo_put(envp->hWriterInFifo,hDstBuf)
//将编码数据缓冲指针写入管道,供write线程读取
Fifo_put(envp->hCaptureInFifo,hCapBuf)
//将缓冲指针写回管道,供capture线程使用
Write线程负责将编码的视频数据写入共享内存,由RTP模块读取打包发送。关键代码如下:
shm_pn=createShm(SHM_DIR,SHARE_SIZE)
//创建共享内存
Fifo_get(envp->hInFifo,&hOutBuf)
//从管道读取一帧编码的视频数据
wirteShm(shm_pn,Buffer_getUserPtr(hOutBuf),Buffer_getNumBytesUsed(hOutBuf))//将编码数据写入共享内存
Fifo_put(envp->hOutBuf,hOutBuf)//将缓冲指针写回管道
3.2 音频采集解码编码模块实现
音频处理模块由采集编码和解码播放两部分组成,通过与上层RTP模块的交互实现双向语音功能。在接收到视频请求信令之后,音频处理模块创建两个线程用于处理语音数据,Speech线程负责语音数据的采集、G711编码,SpeechDec线程负责对G711数据进行解码、播放。两功能模块独立工作,互不影响。
Speech线程主要代码如下:
Shm_audio=createShm(AUDIO_SHM_DIR,AUDIO_SHARE _SIZE)//创建共享内存
hSe1=Senc1_create(hEngine,envp->speechEncoder,params,dynParams)//创建g711编码器
hSound=Sound_create(&sAttrs)
//创建一个音频捕捉设备实例
Sound_read(hSound,hInbuf)//读取音频数据到缓冲区
Senc1_process(hInbuf,hOutBuf)
//将PCM音频数据进行G711编码
writeShm(shm_audio,Buffer_getUserPtr(hOutBuf),Buffer_
getNumBytesUsed(hOutBuf)//将音频数据写入共享内存
SpeechDec线程实现过程与Speech线程类似,这里不再赘述。
3.3 RTP模块设计与实现
RTP模块实现RTP数据包的发送和接收功能,通过与信令控制模块的信息交互来完成发送、接收线程的创建与结束。发送线程从共享内存读取H.264数据和G711数据,并将编码音视频数据进行RTP打包发送。
音频接收线程在接收到RTP数据后,由于网络传输导致数据包到达的顺序具有不确定性,因此需要对语音数据进行缓存排序。首先将G711语音数据包放入缓冲队列中,通过RTP包的序号进行优先级排序。然后取缓冲队列音频数据,写入共享内存,供音频解码播放模块读取播放。合适的缓冲区大小设置尤为重要,缓冲队列设置过小会导致语音包乱序,语音质量较差;缓冲队列设置过大,语音延时较大,用户体验差。需要根据实际网络状况和用户需求设置缓冲队列大小。
4 视频监控测试
嵌入式设备、PC客户端通过3G/WLAN网向服务器平台注册登录,进行视频监控功能测试。客户端发起视频请求并成功之后,可以观看终端设备采集的视频,并在开启音频请求之后实现与采集设备终端的双向语音通信。测试结果表明,视频画面清晰流畅,可进行双向语音通信,语音质量较好。视频监控效果如图4所示。
5 结论
本文介绍了一种嵌入式视频监控系统终端软件的设计与实现方案,并且通过实际的传输测试实现了音视频数据的流畅传输和播放。整个终端系统具有通用、安装方便、稳定、可靠和成本低等优点,适用于视频监控系统领域,具有很好的应用前景。
参考文献
[1] 张云.视频监控系统的发展趋势[J].中国科技博览,2011(11):32-35.
[2] 刘继超.基于DM355的嵌入式网络视频监控系统设计[D].青岛:青岛科技大学,2009.
[3] 宋经玮.嵌入式网络视频监控设备的驱动设计与开发[D].杭州:浙江工业大学,2013.
[4] 宋建勋,刘峰.基于TMS320DM365多平台实时视频传输系统的设计与实现[J].电视技术,2011,35(7):32-35,40.
[5] 冯国进.嵌入式Linux驱动程序设计从入门到精通[M].北京:清华大学出版社,2008.