胡海勇,胡黎玮,徐志江,杨伟伟
(1.浙江省光纤通信技术重点研究实验室,浙江杭州310023;2.浙江鸿程计算机系统有限公司,浙江杭州310023)
基于塞班智能手机的视频监控设计与实现
胡海勇1,胡黎玮2,徐志江1,杨伟伟1
(1.浙江省光纤通信技术重点研究实验室,浙江杭州310023;2.浙江鸿程计算机系统有限公司,浙江杭州310023)
智能手机的发展推动了视频监控方式的改变。该文以Symbian S60作为客户端软件设计的开发平台,利用RTP的API接口来接收服务器端发送的流媒体数据,对接收到的数据先进行NALU重组,然后送给ffmpeg解码器,最后采用直接屏幕访问来播放视频。
视频监控;塞班平台;实时传输协议;视频解码
随着3G业务的发展,手机视频监控将成为3G视频应用的重要组成部分。目前在欧洲,北美,亚洲的日本和韩国手机视频监控已是相当的普遍,国内由于政策、经济、社会以及技术环境的影响,其业务种类、市场规模和商业模式还有待提高[1]。本文详细介绍了一种基于Symbian智能手机H.264视频监控的设计,实现了在智能手机上利用RTP的API接口来接收RTP数据包,对拆包后的每个NALU进行重组,用ffmpeg对H.264文件进行解码,解码成YUV格式,然后用直接绘屏的方法进行RGB显示。经过在SDK中的模拟,并编译安装到手机,获得了较好的监控效果。
本文所设计的客户端软件结构框图如图1所示,主要由流媒体接收模块、码流缓冲模块、NALU重组模块、视频解码模块和视频播放模块组成。码流缓冲模块是为了克服网络延迟、丢包、不稳定等问题带来的数据抖动,避免在播放中出现中断的现象而设计的。对一个H.264的数据采用RFC3984的RTP封装格式,因此需要对解包的数据流进行组帧,这个由NALU重组模块来实现。视频解码模块负责把组好的各个NALU进行解码,用到的解码器是开源的ffmpeg。视频播放模块就是实时显示解码后的视频,它是通过Symbian S60下的CDirectScreenAccess类来实现的。
图1 客户端软件结构框图
本系统客户端接收的是经过RTP打包的流媒体数据,利用的是Symbian SDK中的扩展插件,该插件提供了用于流媒体服务的一些API接口,在开发环境Carbide.C++2.3的应用中只要加入相应的头文件和库文件就可以实现流媒体的接收。具体的网络接收步骤如下:
(1)连接至套接字服务器。RSocketServ类的成员函数Connect()实现;
(2)打开并启动一个网络链接。RConnection类的成员函数Open()和Start()实现;
(3)打开并创建RTP会话。CRtpAPI类的成员函数OpenL()和CreateSessionL()实现;
(4)注册RTP和RTCP回调对象。CRtpAPI类的成员函数RegisterRtpObserver()和RegisterRtcpObserver()实现;
(5)创建一个RTP接收流并启动RTP会话。CRtpAPI类的成员函数CreateReceiveStreamL()和Start-Session()实现。
在客户端设置缓冲区以抵消时延抖动,从而保证流媒体内及流媒体间的同步,是实现流媒体同步的有效方法。但缓冲区的大小设置与具体的硬件设备相关,太小可能会丢失数据,使播放质量下降,太大则会使播放时延变大,而且较大的缓冲区增加了系统开销。根据手机资源有限的特点,使用了循环对列的数据结构来实现缓冲。具体就是指当达到缓冲尾的时候,使它的指针指向缓冲头,从而实现循环缓冲。
对于用RFC3984协议封装的RTP包,它的格式是当包比较大时就要对NALU分片,当包比较小时就要通过几个NALU组成一个RTP包来发送,这其中的设置门槛是通过最大传输单元(MTU)来定的。所以针对一个H.264文件的RTP打包有3种模式:(1)单一NALU单元模式;(2)组合封包模式;(3)分片封包模式。这样在客户端就要对接收的数据进行封包模式的判断,判断出后对NALU进行重组。其中判断的准则是根据NALU头的低5比特是不是28,如果是28则是分片的,需要对接收的这几个RTP包进行组合。对于局域网(如用WIFI)来说传输基本上是顺序来的,也就是服务器发的顺序跟客户端接收的NALU顺序是一样的,但是对于外网(如用3G)的传输就不一定,因此对接受的NALU进行排序就显得尤为重要,排序的准则是取得RTP包头的信息,根据RTP发包的特点,每发送一个RTP数据包,RTP头中的序列号加1,因此客户端可以根据这个序列号来重建包序列。本客户端具体实现的方法是通过建立两个活动窗口:一个用于排序,一个用于存放排序好的NALU。
通过重组的NALU,就可以把它送给解码器解码了,解码库采用的是移植到Symbian下的ffmpeg,利用该库提供的API接口实现视频的解码。具体的解码步骤如下:
(1)初始化解码器,并且找到H.264解码器。函数avcodec_init()和avcodec_find_decoder(CODEC_ID_H264)实现;
(2)分配解码器内存,打开解码器。函数avcodec_alloc_context()和avcodec_open()实现
(3)分配解码器用的帧缓冲。函数avcodec_alloc_frame()实现;
(4)对NALU进行解码,解码成YUV格式,并放在帧缓冲里面。函数decode_frame()实现。
视频播放模块主要功能是对解码后的数据进行播放,采用的方法是把YUV转化为RGB,然后通过直接画图的方法实现,在Symbian OS中直接画图有3种:(2)创建并使用CfbsScreenDevice类;(2)直接访问屏幕内存;(3)通过CDirectScreenAccess类[2]。其中第三种方法是经过操作系统封装后的直接屏幕访问(DSA)技术,它比前两种更安全,也更高效,因为使用的屏幕不用每次都和窗口服务器交互,因此能大大的提高显示效率和质量[3]。因此本客户端采用了直接屏幕访问来播放视频。具体的视频播放步骤如下:
(1)通知窗口服务器去启动直接屏幕访问并设置屏幕的图形上下文。CDirectScreenAccess类的成员函数StartL()实现;
(2)创建一个特定尺寸和显示模式的位图。CFbsBitmap类的成员函数Create()实现;
(3)锁住全局位图堆栈并取得位图中第一个像素的地址。CFbsBitmap类的成员函数LockHeap()和DataAddress();
(4)把解码后用YUV色彩空间表示的位图转化为用RGB表示;
(5)释放位图堆栈并调用能将位图进行缩放的位图绘制函数。CFbsBitmap类的成员函数Unlock-Heap()和CFbsBitGc类的成员函数DrawBitmap()[4]。
经过以上的步骤就可以绘制图片了,再通过CfbsScreenDevice类的Update()就可以对图片进行连续绘制,从而实现视频的播放。
在Symbian OS中活动对象和活动调度器一起被称为活动对象框架,它主要用于简化异步程序设计,使编写代码更容易。每个活动对象封装一个任务,所有活动对象都在同一个线程中运行,因此在活动对象中切换比线程间上下文切换的代价要低。
本客户端的设计是用线程来解码,活动对象来显示播放,其中线程是在活动对象中创建的。具体实现如下:
(1)利用RThread类[5]的成员函数Create()创建一个线程,并在参数中加入线程的执行函数;
(2)启动线程。RThread类的成员函数Resume();
(3)在线程的执行函数中创建一个清理栈,并和字体与位图服务器建立连接;
(4)实现上文2.4节中的视频解码。
对前端摄像头采集的视频可以在SDK中的模拟器中实现监控,也可以编译安装到手机上实现手机上的监控,模拟器和在Nokia E63上的效果图如图2、3所示,从画面上来看效果还是比较好的。
图2 模拟器上效果图
图3 Nokia E63上效果图
现有的主流手机操作系统有Android,windowsmobile,symbian等,Android是一个基于linux内核的操作系统,技术比较新,因此也有它的一些缺点,比如它没有自带资源管理器和任务管理器、界面定制不够简单等,在这个平台上研究资料相对来说比较少;windowsmobile是微软进军移动行业的一个重大的战略调整,对硬件的要求比较高;而对于symbian系统,应用是其最大的特点,且现在在手机操作系统的占有率上比较高,因此选择应用较为广泛、普遍的symbian作为开发平台,在symbian上开发本应用程序选用symbian os C++而非J2ME作为软件开发语言,因为symbian os C++有完备的API集可以访问智能手机的所有属性。本文的特点是给出了手机客户端上实现视频监控过程的每一个API,并详细解释了每一API的作用及各个API之间的联系,采用了线程来解码,活动对象来播放视频的方式,实现了基于H.264的流媒体数据的显示。对比过很多的方法,如起先选用BitBlt()函数来绘制位图,得到的位图不能进行缩放;对接收到的NALU没有进行排序,从而出现了花屏,倒序现象;对缓冲机制的内存设置太大,从而出现了手机死机,程序跑死等现象。而采用本文的方法,解决了这些问题,视频能较好的得到监控。
随着经济的不断发展,基础网络的不断普及,人们对监控的实时性与便利性提出了更高的要求,手机视频监控从很大程度上满足了这一要求。本文从整体上介绍了监控客户端的设计与实现,对如何从流媒体中接受RTP数据包、对接收的包如何组包和排序以及对视频解码与播放所涉及的主要函数及实现都做了阐述。通过本文的介绍,使读者能够建立起一种在智能手机上实现视频监控的案例,对于以后更好的设计与实现提供了一种参考。
[1]贾振堂,吕海莲,韩艳芳.手机视频监控系统及其性能[J].视频技术应用与工程,2007,31(11):81-83.
[2]简洪波.基于Symbian平台的移动流媒体客户端的研究和实现[D].武汉:华中科技大学,2007.
[3]申超,周兵.基于H.264的监控系统中手机客户端的设计[J].微计算机信息,2009,25(3):118-120.
[4]刘昕宇,陈晓光,刘斌.基于Symbian OS的手机开发与应用实践[M].北京:清华大学出版社,2008:374-380.
[5]Steve Babin.周良忠译.Symbian OS软件开发——应用C++开发智能手机应用程序入门[M].北京:人民邮电出版社,2006:172-187.
()函数会自动接收并把数据包发送给处理队列,这其中可以发送一个RTCP包给服务器,服务器可以根据接收的RTCP包的信息动态的改变传输速率,甚至改变有效载荷类型等。
The Design and Implementation of Video Surveillance Based on Symbian Smartphone HU Hai-yong1,HU Li-wei2,XU Zhi-jiang1,YANGWei-wei1
(1.Zhejiang ProvincialKey Lab.of Fiber Optic Communication Technology,Hangzhou Zhejiang310023,China;2.Zhejiang Hong Cheng Computer System Co.,Ltd,Hangzhou Zhejiang310023,China)
The way of video surveillance isbeing changed by thedevelopmentof smartphone.In this paper,weuse the Symbian S60 platform to design the clientsoftware.The APIof the RTP is used to receive the stream data from the server.The data is rebuilt into NALU packet first,and then delivered to ffmpeg decoder.After decoded,the data is finally played in the screen ofmobile using direct screen access.
video surveillance;Symbian platform;RTP;H.264
TP39
A
1001-9146(2010)05-0157-04
2010-07-20
胡海勇(1985-),男,浙江江山人,在读研究生,通信与信息系统.