首页 > 范文大全 > 正文

嵌入式的网络视频传输系统的设计与实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇嵌入式的网络视频传输系统的设计与实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:该文提出了一种嵌入式网络视频传输系统设计方案,系统中以S3C2410为嵌入式处理器, Linux为操作系统,构建了嵌入式网络视频传输系统的软硬件平台,文中简要介绍了基于ARM-Linux平台的网络视频传输系统设计方案,重点对基于ARM-Linux平台的网络视频传输系统的硬件组成及软件设计进行了详细的阐述。

关键词:视频传输;网络视频;嵌入式系统

中图分类号:TP37文献标识码:A文章编号:1009-3044(2010)22-6321-03

The Design and Realization of Embedded Network Video Transmission System

HU Peng1,2

(1.Department of Computer Science, Wuhan University, Wuhan 430074, China; 2.Department of Computer Technology and Application, Wuhan Institute of Technology, Wuhan 430074, China)

Abstract:This paper puts forward design solution of an embedded Network Video Transmission System. The system is designed with the core being S3C2410 and the operating system Linux, This paper introduced the design methods of Network Video Transmission System, and placed its importance on the hardware design and software design of Network Video Transmission System.

Key words: video transmission; network video; embedded system

随着多媒体技术、网络技术的快速发展,远程视频采集传输相关应用已经成为安防、人防等行业的重要应用,而如何更好的获得监控现场的图象数据一直是个热点问题,传统的采用CCD摄像机获取现场视频信息的方法易于实现,但成本较高,相较之下采用ARM+Linux嵌入式系统实现图象的采集与传输具有无可比拟的优势。

1 方案设计

该方案以实时抓拍高清晰图片为主要手段,辅以现场环境数据采集,将远程无人值守或观测人员无法到达的现场情况以高清晰图文信息、准确的现场状态数据的方式实时传送至监控中心并呈现给监测人员,从而实现了实时图片状态信息数据的采集、通信、分析、处理和应用的一体化,为系统监控人员实时观测、分析及处理现场状况提供了快速的、便捷的、高效率的、全新的解决方案。

该方案可应用于各种不同需求的场合。对于仅对高清图文信息有特别需求的用户,可以携带移动终端进行随时随地的图文信息实时采集,即时传送;又可以通过固定前端定时自动拍摄、发送现场图片;还可以远程操控固定前端拍照,实时获取前方高清晰图片。

对于既需要获取现场图片又要求得到现场环境监测数据的用户,在以上述方式获取高清现场图片的同时,还可以通过终端带扩张的485通信接口实时采集多路现场监测数据。

2 系统构成与基本原理

该系统采用USB摄像头采集现场图像数据,然后将采集到的图象通过USB接口传输到基于ARM架构的32位嵌入式处理器,在SDRAM中以MPEG4的方式进行图像压缩处理,然后,按照UDP包的格式打包,通过RJ45接口或GPRS/CDMA模块向监控中心发送,同时监控中心也可以通过网络控制视频采集设备的工作。该系统为实现远程实时监控系统,对监控数据的管理以及视频网络传输等提供了解决方案,系统构成框架图如图1所示。

1) 嵌入式处理器:嵌入式处理器是整个系统的控制管理中心,系统选用S3C2410作为嵌入式处理器,S3C2410 是基于 ARM920T 内核,主频 200M 。

2)存储器设计:采用1片64M Nand flash作为启动ROM和系统程序保存ROM;采用1片16M×32bit共64M SDRAM用于设置程序堆栈和存放各种数据变量等。

3)USB芯片:采用Cypress公司的SL811HS芯片作为USB接口芯片,1个USB host,1个USB device。

4)USB摄像头:采用OmniVision公司的OV511,Linux内核支持该摄像头芯片,USB接口支持1.1/2.0。

5)LCD:本文选用SL3204LCD显示屏,其是一个32x4的LCD驱动器,可软件程控使其适用于多样化的LCD应用线路。

6)GPRS模块:选用西门子MC55嵌入式GPRS模块,该模块内置TCP/IP协议,支持双频GSM宽带900MHz/1800MHz,可通过SMS短消息服务或GPRS来发送或接收资料。

7)以太网芯片:选用RealTek的RTL8019AS芯片,采用QFP-100封装,是一种全双工即插即用的以太网控制器,它在一块芯片上集成了RTL8019内核和一个16KB的SDRAM存储器。

8)CDMA模块:采用华为CDMA模块EM200,是新一代CDMA模块,CM320的替代产品,主芯片采用高通的6020芯片,内嵌TCP/IP协议。

3 软件设计

3.1 视频采集

1) USB 摄像头驱动

视频采集是系统的基本功能,在本系统中,采用USB 摄像头采集视频数据,在Linux中USB摄像头被作为一种字符设备来处理,用/dev/video0来表示,在Linux内核中包含了Ov5ll摄像头驱动程序,在搭建开发环境过程中,在编译操作系统内核时,需要加载OV5ll摄像头驱动。加载驱动的方法有两种:动态加载与静态加载,本文用静态加载方法,具体步骤如下:

① 进行内核裁减,在ARM Linux的kernel目录下 make menuconfig。

② 加载video4linux模块,选择 Multimedia device下的Video for linux,为视频采集设备提供编程接口。

③ 加载ov5ll接口芯片的USB数字摄像头驱动,在 usb support录下选择support for USB和 USBcamera ov511 suppor

④ Make dep为编译生成相关的依赖文件,make zlmage最终的编译命令。

2) V4L编程

v4L (video for Linux)是Linux中关于视频设备的内核驱动程序,v4L处于应用程序和视频设备驱动之间,它屏蔽了视频设备驱动程序的差异,向应用程序提供了统一的编程接口。Linux下用V4L视频程序设计时常用的数据结构有:

① Video_capability:视频设备基本信息数据结构,包括设备名称、设备类型、设备数目、信号源信息、最大分辨率、最小分辨率、信道数等;

② Video_ picture:图象属性数据结构,包括如亮度、灰度、对比度、深度等;

③ Video_channel:信号源属性数据结构,包括信号源编号、名字、制式、调谐器个数等;

④ Video_ Window:采集窗口数据结构,包括窗口的位置、大小等;

⑤ Video_mbuf:映射帧信息数据结构,包括帧数、帧大小、每帧基址偏移等。

⑥ Video_mmap:用于内存映射;

⑦ Video_buffer:最底层对缓冲器的描述。

3) 图像采集程序开发

v4L下图象采集程序的流程:首先打开USB摄像头,读取摄像头的设备信息,更改设备当前的设置(如图像格式),接着,开始进行图像采集,最后将采集到的图像通过LCD显示。

① 使用fd=open(“/dev/v4l/video0”,O_RDWR)函数打开USB摄像头设备,其中,/dev/v4l/video0是打开的设备名,O_RDWR是打开方式(读写方式)。

② 使用ioctl(fd,VIDIOCGCAP,video_cability *)函数获取video设备源的信息,其中,fd是打开的文件描述符,VIDIOCGCAP是控制读写设备通道以获取摄像头信息,video_cability是函数成功后从内核空间拷贝到用户程序空间的摄像头信息,

③ 使用ioctl(fd,VIDIOCGPICT,video_picture *)函数获取缓冲区中图像的信息,其中,fd打开的文件描述符,VIDIOCGPICT是操作命令,video_picture是函数成功后返回的图像信息。

④ 使用ioctl(fd,VIDIOCSPCT,video_picture *)函数设置缓冲区中图像的格式,其中,fd是打开的文件描述符,VIDIOCSPCT是控制读写设备通道以设置图像信息,video_picture是要设置的图像格式信息。

⑤ 使用ioctl(fd,VIDIOCGPICT,video_mbuf *)函数获得摄像头存储缓冲区帧信息, 之后修改viode_mmap中的设置重新设置图像帧的垂直及水平分辨率、彩色显示格式, 接着把摄像头对应的设备文件映射到内存区。

⑥ 连续采集数据

while(1)

{

v4lsync(&device, frame);//等待

framenum = (framenum +l)%2;//下一帧的frame

v4lcapture(&device, framenum);//获取下一帧

buffer = (char*)v4lgetaddress(&device);

}

⑦ LCD显示。用fb=open(”/dev/fb/0”,O_RDWR)直接将图像数据写入FrameBuffer中。

3.2 视频压缩

在网络视频传输系统中,大量的视频需要通过网络进行传输,这就要求在数据传输之前进行编码压缩以减少数据量。新一代基于对象的编码标准MPEG-4以高压缩率、高质量、低传输率成为目前网络多媒体传输的主要格式和标准,针对MPEG一4的编解码器有很多,主要有XVID,Divx等,本设计中采用开源的XVID软件作为MPEG-4视频压缩的核心算法,版本为xvidcorel.1.2。将XVID应用程序移植到ARM平台的步骤如下:

① 执行#tar -zxvf xvidcore-1.1.2-beta2.tar.gz 解压xvidcorel.1.2软件的源代码,并删除优化代码。

② 执行配置命令/configtire-disable-assembly-host-arm-Iinux生成makefile文件;

③ 通过#make, #make install命令编译程序源代码;

④ 将库文件libxvidcore. so.*拷贝到交叉编译器工作目录的lib子目录下,将libxvidcore.so.*等文件拷贝到目标系统的/usr/lib目录下。

⑤ 在程序中设置相应的参数,调用Xvid编码器提供的接口函数:xvid_ global(),xvid encore(),FrameCodeP(),FrameCodeI()等编写应用程序,然后通过交叉编译,最后将生成的可行文件拷贝至目标板ARM调试执行。

3.3 视频传输模块

Socket是一种网络接口,可以被看成是网络通信的一个端点,采用“打开一读一写-关闭”的方式。Linux支持多种套接字,Socket提供下列三种类型套接字:流式套接字(SOCK --STREAM),数据报式套接字(SOCK--DGRAM),原始式套接字(SOCK--RAW),本系统中采用的是流式套接字,主要使用以下几个函数:

1) 服务进程和客户进程在通信前必须创建各自的套接字,然后才能用相应的套接字进行发送、接收操作,实现数据的传输。socket() 函数创建套接字其原型如下:SOCKET socket (int af, int type, int protocol);

2) 当调用socket() 函数创建了一个套接字后,服务器必须把套接字与自己的地址(包括IP地址与端口号)显式地建立联系,以便客户端向该IP地址和端口号的服务进程请求服务,这个过程是通过调用绑定函数bind() 来实现的。bind() 函数原型如下:int bind (SOCKET s, const struct sockaddr FAR * name, int namelen);

3) 服务器设置监听工作方式后,通过调用 accept() 函数使套接字等待接受客户连接,accept() 函数的原型为:SOCKET accept(SOCKET s, struct sockaddr* addr, int* addrlen);

4) 客户通过 connect() 函数可以和服务器建立一个端到端的连接。connect() 函数原型为:int connect(SOCKET s, const struct sockaddr FAR* name, int namelen);

5) 将服务器上的套接字设置为监听方式工作,使用API函数listen():int listen(SOCKET s, int backlog);

6) 对于面向连接的应用程序来说,一旦客户机与服务器实现连接,则可以进行数据传输。send()、recv() 函数是在已建连接上进行数据收发的函数。 send() 函数的原型为: int send(SOCKET s, const char FAR * buf, int len, int flags);recv() 函数的原型为:int recv(SOCKET s, char FAR * buf, int len, int flags);

7) 一旦网络通信任务完成,就必须释放套接字占用的所有资源。通常调用closesocket() 函数即可以达到目的。closesocket() 函数的原型为:int closesocket(SOCKET s );

8) 网络套接字应用程序结束前,要使用下面这个函数释放 winsock DLL: int WSACleanup(void);

9) 当 Winsock 函数调用发生错误时,可以通过如下函数获得错误代码:

int WSAGetLastError(void);

在服务器端的主程序中,首先通过套接口的Socket ()函数创建Socket描述符,通过bind()函数将该描述符与本地地址绑定,再通过listen()函数实现监听,accept()函数实现主程序阻塞,一直等到有客户端发出连接请求,通过三次握手建立双方的连接。

在客户端程序中,通过建立一个MPEGDownLoad类来与服务器建立连接,下载图像信息,在该类中定义一个socket类型变量通过 new Socket (host,port)为其赋值,然后通过Socket.getlnputstream()和Socket.getoutputstream()得到输入输出流,调用各自的read()方法和 println()方法来实现数据的接收和发送。

4 优势与技术突破

与传统的视频采集方案相较,该方案采用高性能的ARM嵌入式微处理器S3C2410,结合大容量的FLASH芯片存储,运行Linux嵌入式操作系统,便于系统移植以及系统应用升级,整个系统具有通用性、安装方便、稳定、可靠、成本低等优点,特别适合实时性要求不很强的工业控制、远程监控系统等诸多领域,具有很好的应用前景。

嵌入式操作系统在系统中有着至关重要的作用,该方案采用Linux操作系统,Linux源代码开放、系统管理性能好、系统稳定性好。采用Linux操作系统,提高了数据传输速度,降低了系统的建造费用。

参考文献:

[1] 熊茂华,谢建华,熊昕.嵌入式Linux C语言应用程序设计与实践[M].北京:清华大学出版社,2010.

[2] 俞辉.ARM嵌入式Linux系统设计与开发[M].北京:机械工业出版社,2010.

[3] 贺丹丹,张帆,刘峰.嵌入式Linux系统开发教程[M].北京:清华大学出版社,2010.

[4] 徐成.嵌入式Linux系统实训教程[M].北京:人民邮电出版社,2010.