嵌入式Linux的web视频服务器的构建

2019-07-12 22:23发布

http://blog.sina.com.cn/s/blog_53d02d550102v8bu.html
随着嵌入式处理器和开源Linux 的广泛应用,各种视频服务在嵌入式系统中逐渐发展起来。

1.引言        随着多媒体技术、视频压缩编码技术、网络通讯技术的发展,数字视频服务器逐渐发展起来。近年来随着嵌入式处理器和开源Linux 的广泛应用,视频服务已逐渐与嵌入式相结合。本文提出了一种嵌入式 web 视频服务器的构建方法,该系统以嵌入式 Linux 和 S3C2440 为核心平台;在这个平台上构建web服务器和视频服务器,客户可以直接通过浏览网页的方式观看视频。   2.视频采集传输模块的构建        本系统采用的硬件平台是基于 ARM920T架构的嵌入式开发板 S3C2440,CPU主频400MHz,该开发板集成了64MB 32 位的 SDRAM 和 64MB 的NANDFLASH,三个USB host口,3 路UART,4 路DMA,一个采用CS8900Q3以太网控制芯片的10M 网络接口等。摄像头采用中星微301芯片的USB 摄像头。本系统软件部分由视频采集传输模块和web服务器组成。 2.1 视频采集模块        在进行视频采集前需要先安装驱动,video4Linux 是 Linux 中关于视频设备的内核驱动,它为针对视频设备的应用程序编程提供统一的编程接口。本系统的 S3C2440 开发板自带的是Linux2.6.12内核,该内核编译时已加进关于视频设备的内核驱动Video4Linux。

(1)  设备的初始化        调用 open打开设备,利用 ioctl()对设备进行控制,比如设置对比度、亮度、调 {MOD}板, 访问模式等等。主要代码如下:
  1. int fd = open(“/dev/v4l/video0”,O_RDWR); //打开设备
  2. /* 获取设备的基本信息(设备名称、支持的最大最小分辨率、信号源信息等)*/
  3. ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)):
  4. /* 获取设备采集的图象的各种属性 /*
  5. ioctl(vd->fd, VIDIOCGPICT, &(vd->picture));
  6. /* 如果需要改变图像的信息,先改变 picture 中的相应的变量值,再调用 ioctl(vd->fd,VIDIOCSPICT, &(vd->picture))即可,本程序初始化全部采用默认值 */
 (2)采集图像          本系统使用内存映射的方式采集图像,线程采集函数grab()主要代码如下:
  1. /* 分配一段内存,存放采集到的图像数据 */
  2. vd->pFramebuffer =(unsigned char *) mmap(0, vd->videombuf.size, PROT_READ|PROT_WRITE,MAP_SHARED, vd->fd, 0);
  3. for(;;)
  4. {
  5.        /* 开始截取一帧图像,使用内存映射的方式*/
  6.       if((ioctl (vd->fd, VIDIOCMCAPTURE, &(vd->vmmap))) < 0)
  7.       {
  8.            perror ("vidiocmcapture error ");
  9.            erreur = -1;
  10.       }
  11.   /* 等待一帧数据采集完毕,采集到的图像数据就放到了vd->pFramebuffer起始的内存地址内,大小为vd->videombuf.size字节 */
  12.       if (ioctl (vd->fd, VIDIOCSYNC, &vd->vmmap.frame) < 0)
  13.       {
  14.           perror ("vidiocsync error ");
  15.           erreur = -1;
  16.       }
  17. }
       然后在main 函数中创建采集线程,pthread_create (&w1, NULL, (void *) grab, NULL); 该线程一直运行,不断采集图像数据,同时把数据放到缓冲区内,发送线程从缓冲区读取视频数据。  
2.2 视频传输模块        本系统支持多个客户同时访问,所以为每个连接的客户端创建一个线程,专门负责与客户端进行数据交互。首先调用 socket()创建套接口,然后bind()绑定7000 端口到该套接口,调用 listen()监听该套接口,等待客户端的连接,最后调用 accept()与客户端建立连接。视频传输模块的流程如图3:   下面给出创建线程的关键代码:
  1. while (signalquit) //如果没有退出信号就一直运行下去
  2. {
  3.     /* 等待客户端的连接,如果没有连接就一直阻塞下去,如果有客户连接就创建一个线程,在新的套接口上与客户端进行数据交互 */
  4.     if ((new_sock = accept(serv_sock, (struct sockaddr *)&their_addr, &sin_size)) == -1)
  5.     {
  6.         continue;
  7.     }
  8.     pthread_create(&server_th, NULL, (void *)service, &new_sock);
  9. }
       线程函数 server()主要是读缓冲区数据,写入套接口,同时读取套接口的数据,设置下一次采集图像的属性,这里就不再给出代码。   3.嵌入式web 服务器        嵌入式 web 服务器就是把 web 服务器移植到嵌入式系统的服务器。它仍然是基于http文本协议进行通信的,具有标准的接口形式,对客户端来说,访问嵌入式 web服务器就和访问普通的web 服务一样。Boa 是一个小巧的web 服务器,可执行代码只有70KB,占用的系统资源少,速度快安全性能高,本系统采用的就是boa服务器,下载源码解压后,需要修改makefile文件, 把其中变量 CC 的值改成arm-linux-gcc,LD 改成arm-linux-ld,然后make 就可以生成boa 应用程序了,下载boa 和boa.conf 到开发板上,然后根据开发板文件系统,修改boa.conf配置文件,比如日志路径,web 根目录等,把web 页面放入根目录,boa 通过读取配置文件里的根目录内容,就可以返回用户请求的web 页面了。        本系统的Web 页面用HTML 语言设计,如果想通过该web 页面传输视频数据,需要一个applet 小程序,该程序通过HTML 语言中的applet 标记引入,下面是引入applet 程序的代码:
  1. <applet codebase="." archive="JWebcamPlayer.jar" code="JWebcamPlayer.class"name="JWebcamPlayer" ID="JWebcamPlayer" align="center" width="400" height="400"MAYSCRIPT>
  2.     <param name="Color" value="#ffffff">
  3.     <param name="Server" value="">
  4.     <param name="Port" value="7000">
  5.     <PARAM NAME="scriptable" value="true">
  6.     <PARAM NAME="mayscript" value="true">
  7. </applet>
       Codebase 和code 属性给出applet 类的完整路径,align 是applet 窗口显示的位置,width和height 是applet 窗口的大小,Port 是服务器端的视频采集程序的绑定端口,Server 是服务器地址的值,不过是在JWebcamPlayer.java 程序中通过gethost()得到,所以这里设置为空。该applet 程序调用 JWebcamPlayer.jar 包与服务器端的视频发送线程进行数据交互,并在浏览器上显示视频。        JWebcamPlayer 程序获取端口传入的数据并解析,生成对象,输出到Frame 对象中,完成视频播放,可以达到20fps 的帧率。        该applet 小程序以及JWebcamPlayer.jar 是保存在web 服务器上的,当用户访问web 服务器观看视频时,该程序自动装载到网页里,由用户的浏览器解释执行。Applet 被调用时,自动执行JWebcamPlayer.jar 包,该包首先进行一些 socket 和图像显示的初始化工作,比如上段说的得到服务器IP,端口,设置颜 {MOD}值等,然后调用 start()连接视频服务器,播放视频。   4.系统试验        本系统的测试在局域网内进行。客户端使用的是 Windows XP 操作系统,浏览器使用Windows  XP 自带的IE 浏览器,因为播放程序包含java控件,需要先安装 JRE,让浏览器支持java 控件。服务器端使用的是TE2440 自带的Linux 操作系统,把摄像头插入开发板的USB 接口,通过网线把开发板接入本地局域网,通过串口终端把开发板IP 设为本地地址:222.22.66.246 , 启动视频采集程序和web 服务器 。   5.结束语        本文介绍了一种嵌入式 web 视频服务器系统的构建方法,该系统已经在 S3C2440 开发板上实现,可以在局域网内使用。对该系统稍加改进,比如加入视频编码,流控制等,即可实现远程的视频通信。在项目开发周期中,企业考虑最多的便是所需 要投入的研发人员数量以及由此所产生的人力资源费用。在即时通讯领域,如果企业组建团队全部自己来开发,将会遇到多方面的困难,其中包括:1)、所涉及到 的技术面较多,包括音视频采集、编解码、流媒体传输、P2P技术、混音技术等,组建一个团队需用多方面的人才;2)、所涉及到的技术都是底层技术,要求团 队成员有非常丰富的开发经验,而且需要对底层技术有较高的造诣,而且需要精通C++编程,否则项目的风险将不可控;3)、开发是一个长期的过程,企业将面 临居多的风险,所需要的开发费用将成为企业的负担。使用AnyChat SDK可以让企业关注自身的业务需求,由于AnyChat SDK支持VC++、Delphi、C#、VB.Net等开发语言,所以企业组织开发团队时可根据自身的研发力量灵活决策,以较小的人力资源投入获得较高 的收益。