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

简介:

     随着嵌入式处理器和开源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]。使用video4Linux 进行采集视频的流程图如图 1  。 

(1)  设备的初始化

       调用 open  打开设备,利用 ioctl()对设备进行控制,比如设置对比度、亮度、调色板, 访问模式等等。主要代码如下:

    int fd = open(“/dev/v4l/video0”,O_RDWR); //打开设备
    /* 获取设备的基本信息(设备名称、支持的最大最小分辨率、信号源信息等)*/
    ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)):
    /* 获取设备采集的图象的各种属性  /*
     ioctl(vd->fd, VIDIOCGPICT, &(vd->picture));
    /* 如果需要改变图像的信息,先改变 picture 中的相应的变量值,再调用 ioctl(vd->fd, 
    VIDIOCSPICT, &(vd->picture))即可,本程序初始化全部采用默认值  */

 (2)采集图像

         本系统使用内存映射的方式采集图像,线程采集函数grab()主要代码如下:

     /*  分配一段内存,存放采集到的图像数据  */
     vd->pFramebuffer  =(unsigned    char  *)  mmap  (0,  vd->videombuf.size,    PROT_READ| PROT_WRITE,MAP_SHARED, vd->fd, 0); 
     for(;;) 
      {
       /* 开始截取一帧图像,使用内存映射的方式*/
  if ((ioctl (vd->fd, VIDIOCMCAPTURE, &(vd->vmmap))) < 0) 
            { 
             perror ("vidiocmcapture error\n"); 
             erreur = -1; 
            }
  /* 等待一帧数据采集完毕,采集到的图像数据就放到了 vd->pFramebuffer  起始的内存地址内,大小为vd->videombuf.size 字节  */
           if (ioctl (vd->fd, VIDIOCSYNC, &vd->vmmap.frame) < 0) 
            { 
             perror ("vidiocsync error\n"); 
             erreur = -1; 
            } 
      }

     然后在main 函数中创建采集线程,pthread_create (&w1, NULL, (void *) grab, NULL); 该线程一直运行,不断采集图像数据,同时把数据放到缓冲区内,发送线程从缓冲区读取视频数据。


2.2 视频传输模块

    本系统支持多个客户同时访问,所以为每个连接的客户端创建一个线程,专门负责与客户端进行数据交互。首先调用 socket()创建套接口,然后bind()绑定7000 端口到该套接口,调用 listen()监听该套接口,等待客户端的连接,最后调用 accept()与客户端建立连接。视频传输模块的流程如图3:

下面给出创建线程的关键代码:

      while (signalquit) //如果没有退出信号就一直运行下去

      {

         /* 等待客户端的连接,如果没有连接就一直阻塞下去,如果有客户连接就创建一

个线程,在新的套接口上与客户端进行数据交互  */ 
         if ((new_sock = accept(serv_sock, (struct sockaddr *)&their_addr, &sin_size)) == -1) 
         { 
            continue; 
         } 
         pthread_create(&server_th, NULL, (void *)service, &new_sock); 
    }

    线程函数 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 小程序[7],该程序通过HTML 语言中的applet 标记引入,下面是引入applet 程序的

代码:

    <applet   codebase="."  archive="JWebcamPlayer.jar"  code="JWebcamPlayer.class" 
name="JWebcamPlayer"   ID="JWebcamPlayer"  align="center"  width="400"  height="400" 
MAYSCRIPT> 
    <param name="Color" value="#ffffff"> 
    <param name="Server" value=""> 
    <param name="Port" value="7000"> 
    <PARAM NAME="scriptable" value="true"> 
    <PARAM NAME="mayscript" value="true"> 
    </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,端口,设置颜色值等,然后调用 start()连接视频服务器,播放视频。web 服务器和客户端的交互图如图2 所示。

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等开发语言,所以企业组织开发团队时可根据自身的研发力量灵活决策,以较小的人力资源投入获得较高的收益。




本文转自 fanxiaojun 51CTO博客,原文链接:http://blog.51cto.com/2343338/446869,如需转载请自行联系原作者

相关文章
|
4月前
|
安全 Linux 编译器
探索Linux内核的奥秘:从零构建操作系统####
本文旨在通过深入浅出的方式,带领读者踏上一段从零开始构建简化版Linux操作系统的旅程。我们将避开复杂的技术细节,以通俗易懂的语言,逐步揭开Linux内核的神秘面纱,探讨其工作原理、核心组件及如何通过实践加深理解。这既是一次对操作系统原理的深刻洞察,也是一场激发创新思维与实践能力的冒险。 ####
|
2月前
|
Prometheus 运维 监控
Prometheus+Grafana+NodeExporter:构建出色的Linux监控解决方案,让你的运维更轻松
本文介绍如何使用 Prometheus + Grafana + Node Exporter 搭建 Linux 主机监控系统。Prometheus 负责收集和存储指标数据,Grafana 用于可视化展示,Node Exporter 则采集主机的性能数据。通过 Docker 容器化部署,简化安装配置过程。完成安装后,配置 Prometheus 抓取节点数据,并在 Grafana 中添加数据源及导入仪表盘模板,实现对 Linux 主机的全面监控。整个过程简单易行,帮助运维人员轻松掌握系统状态。
288 3
|
3月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
84 3
|
4月前
|
机器学习/深度学习 数据处理 数据库
基于Django的深度学习视频分类Web系统
基于Django的深度学习视频分类Web系统
86 4
基于Django的深度学习视频分类Web系统
|
4月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
66 3
|
6月前
|
JavaScript 搜索推荐 前端开发
从零搭建到部署:Angular与Angular Universal手把手教你实现服务器端渲染(SSR),全面解析及实战指南助你提升Web应用性能与SEO优化效果
【8月更文挑战第31天】服务器端渲染(SSR)是现代Web开发的关键技术,能显著提升SEO效果及首屏加载速度,改善用户体验。Angular Universal作为官方SSR解决方案,允许在服务器端生成静态HTML文件。本文通过具体示例详细介绍如何使用Angular Universal实现SSR,并分享最佳实践。首先需安装Node.js和npm。
174 1
|
6月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
310 0
|
6月前
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
57 0
|
6月前
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
77 0
|
2天前
|
存储 机器学习/深度学习 人工智能
2025年阿里云GPU服务器租用价格、选型策略与应用场景详解
随着AI与高性能计算需求的增长,阿里云提供了多种GPU实例,如NVIDIA V100、A10、T4等,适配不同场景。2025年重点实例中,V100实例GN6v单月3830元起,适合大规模训练;A10实例GN7i单月3213.99元起,适用于混合负载。计费模式有按量付费和包年包月,后者成本更低。针对AI训练、图形渲染及轻量级推理等场景,推荐不同配置以优化成本和性能。阿里云还提供抢占式实例、ESSD云盘等资源优化策略,支持eRDMA网络加速和倚天ARM架构,助力企业在2025年实现智能计算的效率与成本最优平衡。 (该简介为原文内容的高度概括,符合要求的字符限制。)

热门文章

最新文章