王延家,刘知贵
(西南科技大学 信息工程学院,四川 绵阳 621010)
流媒体技术正处在迅速发展的阶段。因其具有实时性和连续性的特点,被广泛用于多媒体新闻发布、视频点播、实时视频会议等互联网信息服务的方方面面。H.264缩标准具有更高的压缩率和质量,同时还引入了面向包的机制,特别适合IP网络传输,支持视频的流媒体传输。借助TI's Davinci技术实现H.264编码,利用开源的LiveMediaServer作为视频流媒体服务器通过网络实现多播,在不同地点通过运行在PC机上的播放器实现视频流的播放。
系统使用 DM6446数字视频评估板(DVEM)[1]做硬件平台,DM6446SOC迎合了嵌入式设备网络连接和音视频编解码的需求。其系统框如图1所示。CCD图像传感器采集的视频信号经过DM6446的VPSS解码成YUV格式的数字信号,通过CodecEngine在DSP侧实现视频的H.264标准压缩,压缩后的视频信号与运行在ARM上的LiveMediaServer流媒体服务器交互,LiveMediaServer响应运行在远程客户端 PC上的播放器软件的请求,将数据通过网络输送到客户端播放器,在客户端可实现播放、暂停、存储等相关功能。
图1 系统框
Davinci技术是一种数字音视频协同解决方案。其采用了一种开放式的模块化架构,其各个组件都是可配置的,利于实现软件的升级和各模块的重用。主要有以下几个大模块组成[2]:
①DSP子系统:主要实现各种格式的音视频编解码算法,算法实例可配置为不同的优先级,由DSP/BIOS调度运行。
②ARM子系统:包括ARM9或Cortex-A8及各种外设。主要完成包括 DSP的初始化、引导,应用程序、图形用户界面的实现等功能。
③VPSS(视频处理子系统):主要实现音/视频的采集、各种预处理、显示和提供图形用户界面等。
CodecEngine是处理器间通信的桥梁[3]。实现过程如图2所示。
图 2 算法调用用过程
首先调用 Engine API VIDENC_p_process(a,b,c);通过OSAL将参数和调用信息打包发送给处理器间通信协议DSPLink;DSPLink中转给DSP侧低优先级的RMS(基础服务程序),RMS根据传递来的信息调用DSP本地的算法创建算法实例;而后将句柄返回给ARM端的应用程序完成调用过程。应用程序线程使用信号量同步于RPC调用。DSP可以运行多个算法实例,执行调用的应用程序线程间通过 FIFO方法实现同步。
LiveMediaServer是一个完善的RTSP程序,支持MPEG、H.264、WAV、ACC等多种格式的音视频文件,使用RTP、RTSP等流媒体传输协议[4-5]。可同时实现多个不同格式的流传输并支持多播,默认使用 RTP/UDP包传输。MediaServer采用“源-目的”模式。源者为数据的生产者,即数据源。目的为数据的消费者,即如把接收到的数据存储到文件就是一个FileSink,而通过RTP打包传输就是1个RTPSink。服务器主类为 liveMedia库下的 RTSPServer;mediaServer下的liveMediaServer为主程序的入口类,DynamicRTSPServer是RTSPServer的实现类。
RTP(实时传输协议):支持实时数据的端到端多播或单播网络传输。它没有交付机制,必须和UDP一起使用。RTP的主要贡献是:时间戳、序号、有效载荷等,所有的有用信息都包含在其分组固定和扩展首部中。
RTSP(实时流传输协议)[6]:作为MediaServer的传输控制协议。在PC播放器与MediaServer间建立并控制流信息,它充当了“网络遥控器”的角色[7]。RTSP客户端维护多个连接,通过与控制通道无关的独立协议发送的流,因此服务器需要维护“会话状态”以便使 RTSP请求和流相互关联。常用的命令有OPTIONS、DESCRIBE等。
Linux运行后处于保护模式,不能直接对硬件进行操作,需要借助系统提供的驱动程序模块通过标准Linux API完成操作。既可以使用标准的Linux API(open、ioctl、poll等)也可以使用 TI开发的与标准 Linux API兼容 EPSI API(VFPE_open、VFPE_control等)实现采集。采集视频信号经过A/V接口输送到CCDC将视频解码数字化后送到视频处理前端的视频输入口,DM6446视频前端再将视频信号进行一些可选的预处理操作,将视频数据的缓存地址提供给应用程序。缓存地址应分配物理连续的地址,流程如图3所示。
图3 采集流程
MediaServer是采用“源—目的”模式基于事件驱动实现的。TaskScheduler∶doEventLoop()开始事件循环。基本过程如下:
对源代码进行修改交叉编译,实现服务器在基于 ARM的达芬奇平台上的运行。在子目录有演示例程,修改其源码使其从传递线程缓存中不断读取压缩编码的H.264视频数据传输到网络。程序片段如下。
修改配置文件config.armlinux。执行genmakefiles在主目录及子目录下生成Makefile,执行make编译即可。
整个系统采用多线程机制,充分利用了系统资源提高系统的性能[8]。系统由4个POSIX线程(pthreads)组成,分别为主线程、采集线程、编码线程、传递线程。线程之间使用条件信号量同步,只有当所有的线程都完成初始化之后才能开始各自的循环。它们使用由Memory_contigAlloc()分配的缓存交换数据。MediaServer作为一个独立进程执行。编码线程从采集线程获取数据进行压缩编码;将编码后的数据送到传递线程;传递线程与 MediaServer交互经网络传送出去。线程间交互如图4所示。
图4 线程间数据交互
对系统进行了测试。使用CCD图像传感器采集D1(720*480)格式的视频信号序列,速率25帧/s,时间35 s左右。经网络传输后由远程 PC机上的兼容播放器进行播放、控制。测试结果表明,视频传输实时性良好、画面质量清晰。系统测试如图5所示。
图5 系统测试
使用达芬奇技术和开源媒体 Live555StreamingMedia实现了一种嵌入式流媒体系统并对系统进行了验证。客户端只需要使用播放器即可对远程场景进行实时查看控制。各种新媒体格式及算法标准不断涌现,采用达芬奇技术的开放架构便于软件模块的重用和升级,加上无线模块以后可容易的实现无线传输功能,具有良好的应用前景。
[1] Texas Instruments.TMS320DM6446 DVEVMv2.0Getting Started Guide[EB/OL]. (2008-11-06) [2011-02-15] .http://www.ti.com/lit/SPRUE66E.
[2] 彭启琮.达芬奇技术—数字图像/视频信号处理新平台[M].北京:电子工业出版社,2008:36-85,98-99.
[3] STEVE Preissig. Programming Details of Codec Engine For DaVinci Technology[EB/OL]. (2006-08-23) [2011-01-25].http://focus.ti.com/docs/prod/folders/print/tms320dm6446.html.
[4] LiveMediaServer[EB/OL]. (2001-07-08) [2011-01-09]. http://www.live555. com/mediaServer.
[5] 宋融融,陈惠民,凌勇. 流媒体播放器实时传输协议的实现[J].通信技术,2005(S1):86-88.
[6] SCHULZRINNE H, RAO A, LANPHIER R.Real Time Streaming Protocol.[EB/OL] (1998-08-23)[2010-12-26].http://www.ietf.org/rfc/rfc2326.txt.
[7] 胡晓,高鹰, 余群,等. 移动数字化校园中流媒体的实现[J].通信技术,2008,41(12):399-401.
[8] Texas Instruments.Encode Demo for the DVEVM/DVS DK1.2[EB/OL].(2007-07-08) [2011-01-19].http://www.ti.comSPRAA96.