Linux的web视频服务器的构建

欢迎进入IT技术社区论坛,与200万技术人员互动交流 >>进入

随着嵌入式处理器和开源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:

[1][2]

放手后的微笑,只是用来掩盖疼痛的伤疤…

Linux的web视频服务器的构建

相关文章:

你感兴趣的文章:

标签云: