基于linux的视频服务器设计

原创 2013年12月06日 14:20:49

         视频服务器软件需要从USB摄像头获取视频数据,将采集的数据经过处理之后,再发送给用户。为实现此功能,需要创建输入输出两个线程。输入线程实现视频采集,输出则响应来自用户的请求,并向用户发送视频图像数据。输入输出线程之间通过共享内存通信,输入线程将图像数据写入共享内存后,输出线程从共享内存中读取数据进行传输,整个流程如下:

 

USB摄像头-------->输入线程--------->共享内存----------->输出线程-----------用户

 

1.基于 V4L2 的视频信号采集

 

       V4L2(VideoFor Linux two)是 Linux 系统下视频设备驱动程序接口规范,为上层应用程序提供了一系列的接口函数,可实现对视频设备的操作,进而完成视频图像的采集。

一般情况下,通过 V4L2 接口采集视频数据的工作流程如下:

       (1)打开视频设备。调用open()函数打开/dev/video()视频设备文件;

       (2)获取设备信息。读取结构体中的摄像头,图像的基本信息。

       (3)设置视频采集的信息参数。视频格式,分辨率,帧速率等。

       (4)申请内核帧缓冲区,用来存放数据;

       (5)采用 mmap 方式将申请到的帧缓冲区从内核空间映射的用户空间,使用户可直接操作采集到的数据;

       (6)将申请到的帧缓冲全部放入视频采集输入队列排队,等待接收存放摄像头采集到的视频数据。

       (7)进行视频采集

       (8)把装有视频数据的帧缓冲区从输出队列取出,然后处理视频数据;

       (9)为了可以循环采集数据,需要将刚刚处理完的帧缓冲区再次放人采集输入队列尾部;

       (10)停止视频采集。

2 .采集程序的编程实现

       将USB摄像头采集的JPEG格式的视频图片拷贝到共享内存。首先创建input输入线程,input 线程首先调用初始化程序input_init,进行必要的初始化,如:打开视频设备,设置设备和图像属性,设置帧速率,申请帧缓冲区,mmap 映射,将缓冲区加入输入队列等工作。初始化完毕后进入 input_run程序中,这部分程序是视频采集的关键步骤,主要工作就是抓取一帧图片,并保存到共享内存中。主要就是调用 grab 模块,使摄像头采集图片到videoIn->tmpbuffer 中,然后使用memcpy_picture 把图片从videoIn->tmpbuffer 转移到pglobal->buf 共享内存里,循环调用 grab 模块,即实现了从 usb 摄像头驱动接口不断采集数据帧存入内存的功能。视频采集流程图如下:


3.视频服务器信号传输功能的设计与实现

       用户与视频服务器之间的通信主要包括用户请求和服务器响应,所以要求视频服务器应具有基于 TCP 协议建立 Socket 连接,监听接收客户端请求或者 HTTP 请求,分析请求,响应请求等功能。具体通信传输过程包含以下几个步骤:

(1)首先嵌入式视频服务器需要完成基本的初始化工作,例如创建环境变量,建立TCP SOCKET套接字,bind 绑定监听端口,listen 开始监听,循环等待客户端的连接请求。
(2)视频服务器监听客户端的连接请求,当在监听端口收到客户端发送的连接请求时,服务器开始接受客户端请求,并保存相应的请求信息。
(3)当服务器接收了来自客户端的请求后,要对接收到的请求进行分析,解析请求的方法,同时服务器还要根据收到的请求给出相应的处理。
(4)完成了相应的处理后,服务器根据请求信息向客户端发送响应信息和需要的数据。

4.传输程序的编程实现

视频服务器是通过标准 Socket 编程实现视频图像传输。总体思路是首先利用 Socket 建立一个 TCP 连接,然后创建一个输出线程 output 处理来自用户的请求,output 线程依据用户要求从共享内存空间中读取图像数据,在 TCP 协议上发送传输带有JPEG 数据的 HTTP 消息给用户中心。

首先是 output_init函数完成相应的初始化工作。初始化的参数包括端口号,存储内存等。接下来是output_run 程序,在程序中成功建立一个 Socket 套接字连接,bind()绑定端口,listen()监听端口,accep()接收数据等过程,然后读取客户端传送的HTTP请求,接下来对接收到HTTP请求消息进行解析,确定客户端的请求类型。如果解析后发现在端口收到请求信息为 GET/?action= stream,就会响应请求,从 pglobal->buf 共享内存中读取数据,运行 send()发送视频流数据到用户中心。这个过程就可以把在 input-plugin 中已经被放到内存的视频信息发送出去了。







大型网站架构演化(三)——使用缓存改善网站性能

网站访问特点和现实世界的财富分配一样遵循二八定律:80%的业务访问集中在20%的数据上。淘宝买家浏览的商品集中在少部分成交数多、评价良好的商品上;百度搜索关键词集中在少部分热门词汇上;只有经常登录的用...

大型网站电商网站架构案例和技术架构的示例

1.大型网站电商网站架构案例 大型网站架构是一个系列文档,欢迎大家关注。本次分享主题:电商网站架构案例。从电商网站的需求,到单机架构,逐步演变为常用的,可供参考的分布式架构的原型。除具备功能需求外,...
  • he90227
  • he90227
  • 2016年03月04日 10:20
  • 10520

基于GM8180的嵌入式视频服务器设计

基于GM8180的嵌入式视频服务器设计一、摘要详细介绍了一种基于台湾智原科技公司GM8180芯片的嵌入式视频服务器设计。描述了该服务器的结构和功能,对系统的各个组成模块进行了分析和介绍,如视频采集模块...

基于嵌入式WEB的视频服务器的设计

当前的信息化时代,是一个构筑在网络基础之上的时代。基于TCP/IP协议的IP网络,像Inter-net、Intranet与Extranet等以令人惊异的不可阻挡之势发展着。而以网络为基础的数字视频监控...
  • reille
  • reille
  • 2011年01月20日 17:00
  • 1222

基于MPEG-4的嵌入式网络视频服务器的设计方案

本文讨论了基于MPEG-4的嵌入式网络视频服务器的设计方案,包括图像压缩、存储方式、通信和操作系统。这4个系统分别实现视频节目的压缩、大容量视频存储、快速的传输通道和节目检索与服务等功能。由于人们对V...

Linux下视频服务器的实现(流媒体Helix Server)

三、安装、启动和停止Helix服务器 1 软件的获取 Helix Server是RealNetworks公司最新的流媒体服务平台,这个系统和微软的Window Media System不同,它...
  • qfkfw
  • qfkfw
  • 2012年02月20日 11:13
  • 8749

基于linux-2.6.35的网络视频服务器移植

声明:本文转自华清远见。基于linux-2.6.35的网络视频服务器移植作者:曹忠明,华清远见嵌入式学院讲师。一、环境主机环境 :ubuntu 10.10        目标机 :FS2410(S3C...

基于linux-2.6.35的网络视频服务器移植和ZC301摄像头的驱动支持

uname -a 作用: 查看系统内核版本号及系统名称 作者:曹忠明,华清远见嵌入式学院讲师。 一、环境 主机环境 :ubuntu 10.10         目标机 :FS2410(S3...

Linux的web视频服务器的构建 (chinaitlab)

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

AnyChat使用攻略之独立部署Linux视频服务器

Linux有不同的版本,目前AnyChat所支持的版本包括:Ubuntu、CentOS、RedHat、Debian、Fedora等,而且每一个版本还细分为32bit、64bit,平台之间存在一些环境差...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于linux的视频服务器设计
举报原因:
原因补充:

(最多只允许输入30个字)