基于ARM9的视频采集传输系统
0 引言
随着多媒体技术及宽带网络传输技术的发展,视频采集及传输系统作为远程视频监控、可视电话会议和工业自动控制领域的一项核心关键技术,近年来也得到了飞速的发展。本文所提出的系统是在新一代基于ARM926EJ-S微处理核的嵌入式开发平台上进行的,并将国际上流行的MPEG-4压缩编解码技术和流媒体传输技术相结合。该系统具有较强的实时性、可交互性及便携性。
1 系统开发硬件平台
本设计采用的开发平台是Freescale i.MX家族的MC9328MX21,作为整个系统的核心微处理器,其ARM926EJ-S核提供了加速的Java支持和高度整合的系统功能模块,如片上模块包括图像加速模块、LCD控制器、USB控制模块、CMOS传感器接口及同步串口等,为开发者进行多媒体应用开发提供了丰富的外围接口。核心板上集成了64MB SDRAM以及16MBFlash存储器,底板资源包括4个四线RS-232串口、1个10 Mbit·s-1/100 Mbit·s-1自适应以太网接口及音视频采集设备,为系统设计时的交叉编译及多媒体数据的处理提供了方便。
系统的关键外围设备、视频数据的采集所使用的CMOS图像传感器OV9640,与传统的CCD图像传感器相比,具有功耗低、体积小、集成度高等优点,并且OV9640支持VGA、QVGA、CIF等多种解析度,支持的数据格式包括YCrCb 4:2:2、GRB 4:2:2和RGB:RawData这3种,图像帧传输速率达30帧/s。传感器通过CSI模块进行图像数据的采集,然后通过专用总线传输至PRP(eMMA Pre-processor),在PRP中调整图像大小并转换成合适的颜色空间。PRP的输出分成2个通道,通道1输出RGB565格式数据作为LCD的显示,通道2输出YUV420格式数据进行MPEG或者JPEG编码。图1是图像传感器和MC9328MX21的连接原理图。

在两者连接中,各模块端口的作用分别是:CSI端口为传输图像数据;I2C端口为配置传感器;GPIO为控制传感器。
MC9328MX21的CSI模块有一个8位输入端口,如果传感器的传输超过8位数据,图像传感器通常作为从设备通过I2C端口控制。底层的协议是I2C,高层的协议则由传感器确定。在这里,图像传感器的主时钟由MC9328MX21提供。
2 系统的软件系统设计
2.1 搭建交叉编译环境
由于嵌入式系统选用的是开源的基于ARM微处理器的系统内核ARM-Linux,而在开发板上没有足够的资源运行开发调试工具,所以必须首先搭建好交叉编译调试环境。首先,需要通过在编译时指定target=arm-linux生成适合ARM平台的binutils,它包括了ld、ar和as等一些生成和处理二进制文件的工具。然后,编译生成GCC(GNU Compiler Collection),它能够支持多种高级语言,如C,C++等,需要注意的是,在编译GCC时需要ARM-linux内核头文件的支持,所以首先需要配置内核#make menuconfig ARCH=ARM来生成对应ARM内核的头文件,这样就可以在配置编译GCC时通过with-headers选项指定编译所需头文件。最后,还需要编译生成许多用户层应用都要用到的函数库glibc,所有动态链接的程序都要用到它,在编译时需要注意的是打开--enable-add-ons选项,这个开关将打开glibc的附加包,因为我们需要用到linu-xthreads。这样,一个嵌入式ARM-linux下的交叉编译环境就已搭建成功。
2.2 编译制作内核及文件系统
通过make menuconfig配置内核选项,其中的一些关键设置包括指定System Type时打开ARM926T CPUidle、I-Cache 0n和D-Cache,并且由于在进行应用软件开发时需要ARM-linux内核支持frame buffer技术,所以还需要打开Console drivers中的Frame-buffer sup-port。然后,make boot就可以编译生成定制好的内核映像文件Image,将制作好的系统内核和文件系统通过宿主机的TFTP服务烧写进开发板的Flash存储器。这样就完成了板上可独立运行的操作系统的设计。
2.3 视频数据的采集、编码和传输的实现
这部分的工作是整个设计的核心。MPEG-4在1999年初正式成为国际标准,与之前的标准相比,它更加重视多媒体系统的交互性和灵活性,主要针对视频会议、可视电话的超低比特率编码等多媒体应用。目前在嵌入式系统中,MPEG-4编解码主要都是通过专用芯片实现的,其实现方法与MPEG-1、MPEG-2的硬件实现方法类似,将编码算法固化在芯片的硬件电路中,所以导致它在使用中存在以下缺点:
a) 性价比不高。由于现在MPEG-4编码技术还在不断发展中,还没有一个真正成熟的算法支持,所以市场上推出的MPEG-4编码芯片都是在标准基础上进行了修改和简化,在性能上与H.263等编码芯片上没有明显的优势,所以其性价比不高。
b) 可移植性差。由于各厂商所生产的编码芯片都在固化时加入了自己对编码算法的改进和优化,所以在解码端必须使用对应的专用解码器,这就导致出现了兼容性的问题。
c) 无可扩展性。随着对MPEG-4编解码标准的研究,必然提出许多新的算法及对原有算法的改进,但是现有的MPEG-4编码芯片已将已有的算法固定在了芯片硬件电路中,所以无法方便地在芯片上进行算法的修改及扩展。
所以在设计该系统时,主要采用了软件实现其编解码,在嵌入式系统中采用软件实现编解码,可以弥补硬件编解码上的诸多不足,而且便于对算法本身进行研究和改进。但是,也需要考虑几个问题:首先,由于MPEG-4编码算法运算量复杂,而嵌入式系统的资源有限,所以必须考虑所选平台微处理器的运算能力;其次,在编码软件及数据采集硬件的接口部分,由于需要针对不同的采集硬件,所以需要做许多汇编级的优化。
FFMPEG是一个音视频数据的采集记录、编码及流式传输的完全解决方案。该项目包括下面组件:
a) FFMPEG是音视频文件格式转换的命令行方式的工具,同时支持实时的采集编码TV card数据。
b) FFserver可以通过HTTP/RTSP方式进行多媒体数据的流式播放。
c) FFplayer是基于FFMPEG库和SDL的播放器。
d) libavcodec包括了全部FFMPEG音视频的编解码库,libavformat包括了全部支持的音视频格式的语法和生成库。
FFMPEG库支持的编解码支持格式非常丰富,而且编解码速度很快;支持指定音视频捕捉设备实时处理数据源并将其存;FFMEPG能够通过命令行参数指定视频编解码、格式转换的帧频、帧大小及比特率、码率控制缓冲区的大小;并且,FFMPEG可以通过激活视频的高级选项来对编解码的方式进行控制,包括设置帧内编码、视频量化标度的设置、设定p帧以及b与i帧间的qp因子和偏差、运动估计及DCT/IDCT算法的选择,b帧和运动矢量以及交织编码方式的使用。对于视频捕捉设备的选择也可以通过参数来选定,如/dex/video0或DV1394专用通道等。
FFMPEG库能够在多种平台上运行,包括Linux、Windows和Mac OS等系统,在嵌入式系统中,由于嵌入式Linux具有源代码完全开放、可移植性强和对网络的支持好等特点,所以选用了ARM-Linux系统,该系统支持这次选用的ARM9架构的CPU,而FFMPEG是针对通用PC的X86架构的CPU设计的,因此要将FFMPEG移植到ARM9架构的系统上。首先需要通过将其交叉编译成可在ARM-linux上运行的库。具体步骤如下。
将下载的最新的FFMPEG源代码包解压缩再生成FFMPEG目录,然后针对所开发系统的交叉编译链,通过修改configure文件来生成Makefile文件, 然后用make命令通过读取生成的Makefile文件来自动编译生成所需要的FFMPEG库文件和可以在ARM开发板上运行的二进制可执行文件。编译成功以后就可以通过宿主机的NFS服务将宿主机安装到开发板上,这样就可以到相关目录下测试所编译的FFMPEG能否正常地工作:
- 基于T-DMB的手机电视软硬件设计(10-28)
- 模拟视频滤波技术(02-17)
- 基于FPGA的数字视频转换接口的设计与实现(02-07)
- 基于ARM平台的远程视频监控系统的研究(04-22)
- 基于NiosⅡ软核的嵌入式多路视频点播系统(04-23)
- 视频监控中ARM与DSP的HPI接口设计(05-10)
