支持实时流媒体协议的MPEG-4 IP摄像机方案

2008-08-25 14:51:17来源: 电子系统设计

  最近几年,市场上的网络摄像机(IP摄像机)方案层出不穷,但这些方案都存在一个问题:要么就是高端产品,价格高,要么就是低端产品,性能较差,不利于市场推广。本文讨论的MPEG-4网络摄像机(IP摄像机)设计方案基于Atmel公司的主控CPU芯片AT91SAM9260和中星微电子的MPEG-4视频编解码器(CODEC)VC0762MPEG-4,支持RTP/RTSP实时流媒体协议的MPEG-4网络摄像机(IP摄像机)设计方案。本文先简要介绍该系统的特点和性能以及主要芯片的特点,然后重点讨论各芯片之间的接口方式,以及驱动程序开发和应用程序概况。

  本设计中的主控CPU芯片和硬件MPEG-4芯片都是采用更加先进的半导体工艺设计的集成度高、成本比较低的芯片,在降低系统成本的同时,系统性能不但没有降低,反而有大幅度提升。这个系统运行经过优化的Linux,内核版本是稳定的2.6.20,根文件系统采用YAFFS2 NAND Flash的文件系统,支持日志记录。它还移植了LIVE555流媒体服务器,支持但不限于以下开源或者部分开源客户端:VLC Media Player、QuickTime Player、Amino、openRTSP、Mplayer。

  该系统的其它特性还包括:1. 支持PPPoE、DDNS、TCP、UDP、ICMPv4/v6、MLDv1、 ARP、NDP、DHCP、DNS、IGMP网络通信协议;

  2. 支持RTP/RTSP实时流媒体协议;

  3. 支持用SD卡、USB硬盘本地存储MPEG-4媒体文件;

  4. 支持的分辨率包括160×120、320×240、640×480、352×288、702×576;

  5. 支持USB 接口和Wi-Fi;

  6. 支持用GPRS传输JPEG图片;

  7. 采用的操作系统为Linux 2.6.20;

  8. 采用的媒体服务器为mediaServer。

  主要芯片的特点及功能

  Atmel公司的主控CPU芯片AT91SAM9260采用ARM926EJ-S内核的工业级CPU芯片,主频为200MHz,采用了DSP指令扩展和JAVA加速技术。它支持SDRAM、NAND FLASH、SRAM、CF卡接口,支持NAND闪寸,带有一个USB2.0设备接口(全速) 、2个USB2.0主机接口(全速)、10/100自适应以太网接口,并支持MII和RMII接口物理收发器,共集成多达7个UART接口、1个SPI、一个I2C。

  在本设计中,AT91SAM9260被用来运行Linux操作系统,提供人机界面和流媒体服务器运行环境,处理网络通信协议,并提供对文件系统和大容量存储设备的支持。

  中星微电子的MPEG-4视频编解码器(CODEC) VC0762是高性能MPEG-4硬件编解码器,它直接支持CMOS图像传感器(CMOS传感器要比CCD的成本低),由于采用了中星微的CMOS图像处理专利技术,图像清晰度良好。该芯片支持CCIR656、CCIR601视频数据接口;支持自动曝光、自动白平衡处理、自动增益控制、自动对焦、编程对焦、可配置的伽玛校正、可配置的色彩校正、可配置白平衡、具有背光补偿、图像噪点控制、图像锐度控制等;支持JPEG编解码;支持MPEG-4/H.263编解码;支持真彩、伪彩色LCD屏幕;支持OSD;支持CVBS TV输出接口。

  在本设计中,VC0762被用来从CMOS传感器获取原始数据,并接受流媒体服务器的指令,对原始的图像数据经过图像处理,并压缩成系统指定参数的MPEG-4视频流,然后把MPEG-4视频流传递给AT91SAM9260,由流媒体服务器进一步处理,并按照RTP/RTSP协议传送到网络。

  这里还采用Atmel公司的8位AVR单片机ATMEG48来实现红外遥控器的脉冲解码、按钮键盘查询、开关量输入检测、继电器输出控制等,协助Linux系统完成一些实时操作。

  硬件设计

  MPEG-4 IP摄像机的系统硬件框图如图1所示,它采用了64MB SDRAM、64MB NAND闪存和64MB的图像缓存。

  图1:MPEG-4 IP摄像机的系统硬件框图。

  视频编解码器VC0762通过CMOS图像数据接口和I2C两种接口连接Micron公司的MT9V011 CMOS图像传感器。AT91SAM9260通过8位数据总线连接VC0762,读出MPEG-4视频或者是JPEG图片数据流,或者是写入VC0762控制命令。AT91SAM9260外部连接以太网物理收发器DM9161,通过RJ45接口连接互联网,接收网络访问和发送流媒体数据。

  CMOS图像传感器MT9V011和视频编解码器VC0762之间有两种接口,一个是传递图像数据的并行接口,另一个是传递命令的I2C接口,具体电路图见图2。

 

图2:CMOS图像传感器和视频编解码器VC0762之间的接口电路图。

  图2:CMOS图像传感器和视频编解码器VC0762之间的接口电路图。

  请注意,MT9V011的PIXCLK时钟要连接VC0762的GPIO2(H2引脚)为VC0762的图像处理逻辑单元提供像素时钟。MT9V011的CLKIN连接VC0762的CS_CLK(27MHz的主时钟),也可以直接连接27MHz的有源振荡器。FRAME_VALID和LINE_VALID分别是MT9V011输出的场同步信号和行同步信号,分别连接到VC0762的CS_VSYNC,和CS_HSYNC信号端。

  VC0762通过8位并行数据总线连接AT91SAM9260,接口电路见图3。VC0762的CPU_OEN接 AT91SAM9260的CFOE_NRD,VC0762的CPU_WEN接AT91SAM9260的CFWE_NWE_NWR0,VC0762的CPU_CS2N接高电平,CPU_CS1N接AT91SAM9260的NCS5,VC0762的CPU_RS接AT91SAM9260的A19,以实现控制命令数据和图像数据的地址区别。VC0752的数据总线CPU_D0~CPU_D7直接连接AT91SAM9260的数据总线的D0~D7。

图3:视频编解码器VC0762与AT91SAM9260之间的接口电路图。  

图3:视频编解码器VC0762与AT91SAM9260之间的接口电路图。

  软件上通过片选5(NCS5)和地址线A19对VC0762进行操作,AT91SAM9260 CS5地址是0x6000 0000,VC0762的CPU_RS低电平时读写命令,高电平读写数据。

  写命令地址定义为:

  #define V0762_PHY_BASE_ADDR 0x60000000

  写数据地址定义为:

  #define V0762_PHY_BASE_DATA 0x60080000

  单片机ATmeg48和AT91SAM9260的接口电路比较简单,因为这里设计ATmeg48采用3.3V供电,和AT91SAM9260电平兼容。

  软件开发

  硬件平台决定了软件平台的选用,因此可以自由选择软件的余地并不是很大。在AT91SAM9260平台上运行的操作系统有Linux、WinCE、uCOS、FreeRTOS等,出于功能和价格的考虑,这里选用Linux。Linux具有完备的网络协议栈和文件系统,给本设计提供丰富强大的功能。此外,Linux具有大量的驱动程序和应用开源代码,减少了自己开发驱动和应用软件的时间。

  这里需要开发的软件包括:基于linux-2.6内核架构的RS232红外键盘驱动、基于V4L规范的VC0762驱动、本地存储式录像应用程序、流媒体服务器程序等。

  1.RS232接口红外键盘驱动RS232KBD的软件开发

  Linux2.6下的键盘驱动开发起来还是比较简单的,尤其新的2.6以后的内核里已经包含了很多嵌入式的新平台支持,在这些嵌入式平台里有一些类似的红外键盘驱动可以用来参考和移植,比如I2C或者是I/O驱动程序,从而以提高键盘驱动的开发速度。

  RS232KBD驱动程序结构分以下几部分:

  (a)在RS232KBD入口(module_init)使用platform_driver_register(&rs232kbd_driver)函数向系统注册我们的键盘驱动程序。

  rs232kbd_driver结构体如下:

  static struct platform_driver rs232kbd_driver = {

  .probe = rs232kbd_probe,

  .remove = __devexit_p(rs232kbd_remove),

  .driver = {

  .name = "rs232_keyboard",

  },

  };

  其中 .probe是内核提供给我们向系统注册我们驱动的启动函数的一个接口,我们这里指定rs232kbd_probe函数,也就是说当我们加载RS232KBD函数时platform_driver_register(&rs232kbd_driver)将被调用,内核收到这个注册申请稍后将会调用.probe指定的rs232kbd_probe函数来启动我们的RS232KBD驱动程序(注意由于我们使用了平台驱动的方式,我们还必须在内核的arch目录下的at91sam9260_devices.c里定义:

  static struct platform_device rs232_keyboard = {

  .name = "rs232_keyboard",

  .id = -1,

  };

  void __init at91_rs232_kbd(struct at91_rs232_keyboard *kbd, int nr)

  {

  printk("at91_rs232_keyboardrn");

  rs232_keyboard.dev.platform_data = kbd;

  platform_device_register(&rs232_keyboard);

  }

  并在该目录下的board-sam9260ek.c文件里的ek_board_init(void)函数的最后添加代码: at91_rs232_kbd(kbd,ARRAY_SIZE(kbd))。这样我们在加载RS232KBD模块时内核才会调用我们的rs232kbd_probe函数。

  (b)rs232kbd_probe是我们的RS232KBD驱动的入口函数,我们在这里创建一个输入设备,在输入设备里指定键盘的open接口函数rs232kbd_open,close函数rs232kbd_close,最后注册这个输入设备。

  (c)在rs232kbd_probe里初始化AT91SAM9260串口,并申请UART1接收中断。

  (d)在UART1接收中断里接收由单片机发送来的按键或者是解码后的红外数据,进行键盘编码后使用代码:

  input_report_key(rs232kbd->input, rs232kbd->keycode[scancode], pressed);

  将键盘值发送到tty设备。

  (e)驱动测试,当驱动写好后,要进行测试,由于嵌入式设备一般使用超级终端或者是telnet进行登录,键盘驱动不是很好测试,我们使用网上开源的libkbd代码进行键盘驱动的测试,下载libkbd后稍加修改既可以在arm-linux上运行。

  2.VC0762 V4L驱动开发:

  集成电路厂商给我们提供了基于linux平台的VC0762 V4L原型驱动程序,我们要做的就是移植到我们的AT91SAM9260 linux平台上。

  (a)首先要修改地址宏定义以适应我们的硬件设计:

  写命令地址定义:

  #define V0762_PHY_BASE_ADDR 0x60000000

  写数据地址定义:

  #define V0762_PHY_BASE_DATA 0x60080000

  AT91SAM9260读写VC0762时序控制寄存器地址定义:

  #define AT91_BASE_CS5_SMC (0xffffec00 + (0x10 * 5))

  (b)Linux虚拟地址的原因我们需要映射物理地址到内核虚拟地址空间,如下:

  pSMC5 = (void*)ioremap(AT91_BASE_CS5_SMC, 0762_REMAP_RANGE);

  v0762_virt_base_addr = (void*)ioremap(V0762_PHY_BASE_ADDR, V0762_REMAP_RANGE); v0762_virt_base_data = (void*)ioremap(V0762_PHY_BASE_DATA, V0762_REMAP_RANGE);

  (c)配置AT91SAM9260访问VC0762的静态时序:

  void Init_smc(void){

  pSMC5->SMC_SETUP = 0x20302030;

  pSMC5->SMC_PULSE = 0x3F1F3F1F;

  pSMC5->SMC_CYCLE = 0x00C000C0;

  pSMC5->SMC_CTRL = 0x00000003;

  }

  (d)定义读写VC0762函数:

  #define V0762_HOSTSETVAL8(addr, val) WriteMemory8(addr, val)

  #define V0762_HOSTGETVAL8(addr) ReadMemory8(addr)

  #define V0762_WriteMul8Addr(addr)

  {

  V0762_HOSTSETADDR8(v0762_virt_base_addr, ((addr &0xff000000) >> 24));

  V0762_HOSTSETADDR8(v0762_virt_base_addr, ((addr &0xff0000) >> 16));

  V0762_HOSTSETADDR8(v0762_virt_base_addr, ((addr &0xff00) >> 8));

  V0762_HOSTSETADDR8(v0762_virt_base_addr, (addr &0xff));

  }

  #define V0762_WriteMul8Dat(dat)

  {

  V0762_HOSTSETVAL8(v0762_virt_base_data, ((dat &0xff000000) >> 24));

  V0762_HOSTSETVAL8(v0762_virt_base_data, ((dat &0xff0000) >> 16));

  V0762_HOSTSETVAL8(v0762_virt_base_data, ((dat &0xff00) >> 8));

  V0762_HOSTSETVAL8(v0762_virt_base_data, (dat &0xff));

  }

  按照上面的方法处理好后,就可以操作VC0762了,但是实际上我们拿到原型驱后也花费了不少时间进行调试和移植的,上面提到的都是我们调试时的精华。

  3. 本地存储式录像应用程序介绍:

  本地存储式录像应用程序也就是使用SD卡或者移动硬盘存储VC0762压缩后的MPEG-4视频数据文件的应用。SD卡驱动和移动硬盘驱动我们的系统都有很好的支持,我们要做的也就是打开VC0762对应的video0设备,设置视频参数,从video设备读取数据通过avilib库函数写成avi文件存储到SD卡或者是USB硬盘。涉及到的主要函数调用是:

  创建AVI文件:

  AVI_open_output_file("cap.avi");

  打开VC0762视频设备:

  vfd = open("/dev/v4l/video0",O_RDWR);

  设置波特率: ioctl(vfd,IOCTL_MPEG-4_BITRATE,8192);

  开始采集图像: ioctl(vfd,VIDIOCCAPTURE,1);

  读取一帧MPEG-4原始数据: read(vfd,fbuf,128000);

  写MPEG-4视频数据流到AVI文件: AVI_write_frame(avifile,fbuf,flen);

  关闭avi文件: AVI_close("cap.avi");

  关闭VC0762视频设备: close(vfd);

  4. 流媒体服务器程序

  流媒体服务器的作用是把从video设备读取到的MPEG-4格式的流媒体通过RTP/RTSP协议传送到互联网上,客户端可以在全球任意地方通过网络连接到我们的流媒体服务器,实时的查看被监控端的现场状况。

  本设计采用的是移植的路线,从http://www.live555.com 网站获取到LIVsE555 Media Server代码,然后根据自己系统的特点进行移植和修改,使其支持我们的MPEG-4流文件。

  LIVE555 Media Server移植好后可以使用VLC,或者是mplayer等播放器进行测试。

  本文小结

  本设计成功地使用Linux系统设计了一款功能丰富的IP摄像机。虽然采用了MPEG-4编码方式,但由于其低廉的整体成本和优越的系统性能,该方案非常具有市场生命力。

  作者:张驿风、郑呈鑫、刘阳生

  香港百特上海技术中心

  本文使用海纳锐利编辑并转载, 版权归原作者所有。

关键字:实时流媒体  IP  avi文件  存储式  ioctl  CMOS传感器  DDNS  c文

编辑:孙树宾 引用地址:http://www.eeworld.com.cn/afdz/2008/0825/article_1052.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
实时流媒体
IP
avi文件
存储式
ioctl
CMOS传感器
DDNS
c文

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 视频监控 智能卡 防盗报警 智能管理 处理器 传感器 其他技术 综合资讯 安防论坛

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved