admin 管理员组文章数量: 887021
2023年12月17日发(作者:violin的正确发音视频)
2011年第9期 中图分类号:TN919.81 文献标识码:A 文章编号:1009—2552(2011)09—0121—04 基于ARM的视频采集与处理系统的开发 王绪国,余双林 (武汉理工大学信息工程学院,武汉430063) 摘要:介绍了一种基于¥3C2440硬件平台,在Linux 2.6.32内核操作系统下采用V4L2架构进 行视频采集与处理的总体设计方案,通过移植开源的H.264视频编解码器对视频信号进行压缩 编码,并采用RTP流媒体传输协议传输给客户端,完成对现场的网络视频监控任务。实验结果 表明,该系统采集到的图像清晰,显示比较流畅,经H.264编码的视频帧数据量小,网络传输 异常情况下的视频存储正常,可以适用于不同场合尤其是对带宽要求比较高的场合。 关键词:信号与信息处理;嵌入式Linux;V4L2;H.264视频;RTP协议 Development of the video capture and process system based on ARM WANG Xu.guo.YU Shuang.1in (School of Information Engineering,Wuhan University of Technology,Wuhan 430063,China) Abstract:This article introduces an overall scheme of video coHecfing and processing based on¥3 C2440 hardware platform,by using V4L2 framework in the Linux 2.6.32 kerne1.It supervises remote scene htrough network by trnasporting the video signals,which have been compressed and encoded by rtnasplnated open source video codec—H.264,to the client,using the streaming transmission protocol RTP.The experimentla results show that the collected image is clear and video is fluent.The quantity of frame data processed by H.264 encoder is smal1.The video Can be stored normally in exceptional cases. hTis system call be applied in different occasions,especilaly those requires for hihg bandwidth. Key words:singal and information processing;embedded Linux;V4L2;H.264;RrrP 0 引言 肿协议进行实时流媒体传输,在网络异常的情况 随着社会的发展和生活水平的提高,视频监控 下,进行本地的视频存储。 广泛的应用于人们生活的各个方面,在众多的视频 1 系统总体设计方案 采集与处理系统中,嵌入式视频采集不仅具有灵活、 1.1硬件系统概述 低成本、高性能的特点,而且结合嵌入式Linux操作 本系统采用三星公司生产的基于ARM920 T内 系统,可以按照需求对内核进行裁剪,并搭载文件系 核的¥3C2440微处理器,其主频达400 MHz,外围扩 统,构建功能强大的视频采集与处理终端¨J。特别 展了USB Host控制器、网络、SD卡、音频、触摸屏等 是Internet的发展,让人们对视频监控系统提出了 设备。本文采用USB摄像头进行视频信号的采集, 新的要求,视频信号由于信息量大,传输带宽要求 经微处理器进行软件压缩编码后,最终通过 高,大量图像的传输成为多媒体应用的瓶颈,这就需 DM9000网卡将数据传输给客户端。图1为系统的 要我们对视频信号先进行压缩编码,然后在网络上 硬件结构图。 进行传输,以便节省带宽和存储空间。 本文研究的正是基于嵌入式Linux的视频采集 收稿日期:2011—03—24 与处理系统,在Linux 2.6.32内核操作系统下对 作者简介:王绪国(1969一),男,副教授,硕士,研究方向为嵌人式 系统、多媒体通信等。 USB摄像头采集的视频信号进行压缩编码,并采用 一121—
l文件系统 l I应用程序 I I摄像头驱动l l网卡驱动 l l Linux 2.6.32内核l I Bootloader I USB接口 usB摄像头 ————一 I USB Host控制器lI以太网接口j 回匡叵圃回巨圈匹函同厂 图I系统硬件结构 I.2软件系统概述 整个系统软件是在嵌入式Linux 2.6.32版本内 核上,采用v4 架构开发应用程序,软件部分的设 计分为以下几个部分: (1)嵌人式Linux内核的移植与编译,yafs2可 读写文件系统的制作与安装。 (2)基于V4L2视频采集模块的设计。 (3)对视频图像进行H.264压缩编码模块的 设计。 (4)对编码后的数据进行RTP流媒体传输模块 的设计。 (5)网络异常情况的监测与视频的本地存储。 2 ARM上视频采集与处理 2.1 USB摄像头视频采集 V4L2(Video for Linux Two)是Linux内核中关 于视频设备的内核驱动,给视频设备提供统一的 API。在Hnux中,对视频设备的访问可以像访问普 通的设备文件一样进行读写操作,一般使用ioed函 数来对设备的I/O通道进行管理心]。 本文使用USB摄像头来捕获视频,它作为一个 视频设备文件保存 ̄/dev/video0下。主要使用 iocd函数对设备进行设置和读取。 具体采集过程如下: (1)非阻塞方式打开设备文件。应用程序使用 非阻塞方式打开视频设备,当采集端未捕获到有效 数据时,底层驱动仍然会把缓冲区中的数据交给应 用程序。 Cam—Fd:open(“/dev/video0”,0一RDWR I O—NONBLOCK,0) (2)获取设备的capability,查看设备所支持的 功能。 (3)设定参数,如视频输人、视频制式、帧格式 和一帧视频的宽度和高度等。 ioctl(Cam—。Fd,VIDIOC——S—.FMT,&fret) (4)申请帧缓冲,并得到帧缓冲的物理地址。 一l22一 ioctl(Cam_Fd,VIDIOC—REQBUFS,&req) ioed(Cam—Fd,VIDIOC—QUERYBUF,&buf) (5)将申请到的帧缓冲利用mmap函数映射到 用户空间,应用程序可以直接操作该视频帧。 三种方式获取缓冲区中的数据。 ( ̄)read、write方式:在用户空间和内核空间不断 拷贝数据,占用了大量用户内存空间,效率不高。 ②用户指针模式:内存片段由应用程序自己分 配。在v412_requestbuffers里将memory字段设置成 V4L2一MEMORY—USE趾 R。 ③内存映射方式:是一种简单而高效的方式。 在内核空间中开辟内存,在应用程序中将帧缓冲映 射到用户空间中,直接处理设备内存。减少I/O操 作,提高读取效率。 本文利用mmap函数内存映射直接读取缓冲区 而不需要频繁的进行数据的拷贝。mmap函数返回 值是一个指针,指向的是一个帧缓冲区的首地址。 使用完后要使用munmap()函数解除映射关系。 nmmp(NULL,buf.1ength,PROT—READ f PROT— WRITE,MAP_SHARED,Cam_Fd,buf.m.offset); (6)将申请到的帧缓冲全部人列,来存放采集 到的视频数据。 在V4L2驱动程序中维持着两个队列,一个是 输入队列,另一个是输出队列。队列被组织成FIFO 结构,内存片段将按顺序入列到输入队列中,并按照 顺序从输出队列中出列。而对一个视频捕获的程序 来说,它首先会把所有映射好的内存片段入队,然后 开始捕获视频并进入循环,此时应用程序会一直等 待输出队列被填满到可以有内存片段出队。这个过 程需要用到两个iocd命令,VIDIOC—DQBUF和 VIDIOC—.QBUF。 ①首先将申请到的帧缓冲全部人队列,以便驱 动向其存放采集到的数据。 ioctl(Cam_Fd,VIDIOC—.QBUF,&buf)
②开始采集。 enum v4l=!buftype type _一当前码流中包含SP/SI帧后,可以在不同码率的码 流之间快速切换,以适应网络有效带宽的不断变化, —tvpe=V4【2BUF 一PEVIDEOCAPTURE —ioctl(Cam Fd,VIDIOC—STREAMON,&type) 同时支持随机接人和快速回放模式 。 本文采用的视频编解码器是国内视频编码自由 ③出队列以取得已采集到的数据的帧缓冲,从 缓冲区获取原始采集数据。 ioctl(Cam_Fd,VIDIOC—DQBUF,&buf) 组织合力开发的,符合H.264标准的T264视频编 解码器,吸收了JM,X264和Xvid三个源码的优点。 ④出队列后的缓冲区交给应用程序处理,处理 完毕后将缓冲重新放人队列尾,实现循环采集视频 在ARM平台上的编码部分的实现: (1)在redhat 5.4下建立交叉编译环境。 (2)进入avc—src一0.14/ave/build/linmx/目录 数据。 其中较常用的几个命令字和对应的结构体如表 1所示。 表1常用的Ioctl命令 Ioctl命令 功能 对应结构体 VIDIOC_S__FMT设置图像格式 stmd硎2 formattint VIDIOC_G_.FMT获取图像格式 st嘣吡format itnt WDIOCruct v412_formattint _TRYJaCr验证驱动支持的格式 stVIDIOCstmct v4t2 eap ̄ility cap _QUERYCAP查询设备功能 VIDIOC REQBUFS分配内存(缓冲区) slruet v412_requestbuffea ̄mq ⅥⅨ一 slrtmt v412 buffer buf VIDIOC_QBUF 缓冲区^ 列 slruet v412 blifl ̄but" VlDIOC DQBUF 缓冲区出队列 struet v4L2_buffer bur 2.2 H.264视频编码 H.264是在MPEG一4技术的基础上建立起来 的,与现有其它的视频标准相比,在相同的带宽下, 能够编码生成高质量的视频图像,不仅具有优异的 压缩性能,而且具有良好的网络亲和性,其编码流程 主要分为5个部分:帧间和帧内预测、变换和反变 换、量化和反量化、环路滤波、熵编码,其中比较重要 的是帧间和帧内预测编码 J。 2.2.1帧内预测编码 在帧内预测模式中,预测块P是基于已编码重 建块和当前块形成的,帧内预测编码的目的是缩减 图像的空间冗余,由于相邻的宏块通常具有相似的 属性,帧内预测充分利用相邻宏块的空间相关性,在 对给定的宏块编码时,首先根据周围的宏块进行预 测,然后对预测值与实际值的差值进行编码,同直接 对该帧编码相比,可以大大减小码率。 2.2.2帧间预测编码 帧间预测是利用已编码的视频l 场和基于块 的运动补偿的预测模式,利用连续帧中的时间冗余 来进行运动估计和补偿。除支持P帧、B帧外, H.264还支持一种新的流间传送帧SP/SI帧,如果 修改makefile,指定交叉编译,保存退出,make编译 成功后,形成一系列的 .O文件,应用程序利用编 解码器提供的函数进行编程,为防止可能出现的编 译错误,进入ave—src一0.14/avc/build/obj/下删除 T264.O文件。 (3)利用编解码器提供的函数编写应用程序。 利用编解码器提供的原始配置文件enconfig— fas ̄peed baseifne.txt作参考,制作并修改config.txt 中的各项参数来更改编码器的结构。首先在ink— encoder()函数中读取配置文件,并传递给T264一pa— ram_t结构体,对编码器的结构参数进行初始化,该 配置文件包括宏块的高度、宽度、量化系数损失、参 考帧数目、最大最小量化参数、像素插值、搜索范围、 预测模式、CABAC等配置。通过配置不同的参数, 可计算当前的码率,并通过串口输出码率以及在客 户端观察图像的质量,发现对于H.264编码,B帧 和多参考帧数目,直接影响编码效率,其次是搜索范 围、Hadamard变换和熵编码也会影响H.264在 ARM上编码的效率以及图像的质量。这与H.264 编码标准中引起编码复杂度是相匹配的。因此在实 际应用中需修改配置文件并对H.264编码的算法 进行优化,提高编码的效率。具体的编码流程如图 2所示。 Init_cncode )初始化 l 客户端接收并显示 I f 读取配置文件eonfig.txt l 编码后的数据经RTP传输 I f Iniu)mm()初始化编码器结构I T264_encode0编码 I f T264_open0 H 分配内存空间 图2 H.264编码流程 2.3基于Rrl3 ̄协议的视频传输 实时传输协议RTP是处理Intemet上多媒体数 据流的一种网络协议,在一对一或者一对多的传输 情况下工作,整个RTP协议由两个部分组成:RTP 数据协议和RTCP控制协议,R,I'P是目前解决流媒 体实时传输最有效的解决方法。在嵌入式Linux平 一】23—
台上通过移植开源的RTP库JRTPLIB 3.7.1实现流 媒体传输。利用JRTPLIB编写应用程序,其具体实 现过程主要分为三个部分: (1)RTP会话初始化 竖箜矍 频采集的原始 读取并分离NALU 查 H.264解码显示 是l 塑篁 ! l 塑鱼 j!..一 . ......................RTPSession sess;//定义RTPSession类实例表 示本次会话 RTPSessionParams sessparams; RTPUDPv4TransmissionParams transparams; 1..} . .................. 发送 .][.....~ RTP RTCP 圈4 H.264流媒体传输总体架构 sessparams.SetOwnTimestampUnit(1/90000);// 2.4 网络异常情况下的视频存储 设置时间戳发送频率 sessparams.SetAeeeptOwnPackets(咖e);//可以 接收自己发送的流媒体数据 sessparams.SetUsePollThread(true);//为确保 支持线程操作,再次设置为开启(默认是开启的) transparams.SetPortbase(portbase);//设置进行 流媒体数据传输或接收的本机端口 status = sess. Create (sessparams, &transparams);//真正的创建RrIP任务 (2)设置发送数据的目的地的IP地址和目标 端口号 RTPIPv4Address addr(destip,destport);//声明并 初始化RTP ̄4Address类对象addr(设置目标地址) status=sess.AddDestination(addr);//添加目的 地信息 (3)数据发送 在同一个R1]P会话中,数据报一般具有相同的 负载类型、标识和时间戳增量,JRTPLIB允许将会话 设置为默认参数,也可以通过调用RTPSession类的 SetDefaultPayloadType()、SetDefaultMark()和SetDe— faultTimeStamplnerement()方法来完成对会话参数 的重新设置。最后指明发送数据的长度,通过sess. SendPacket()实现数据的发送。 一由于H.264的基本流的结构分为两层:视频编 码层(VCL)和网络适配层(NAL),编码处理后输出 一一一一徽 的VCL数据,先被封装进NAL单元中,RTP传输时 先从码流中分离出每个NALU单元,进行打包,发送 端的流程如图3—4所示。 图3 RTP发送端流程 一124一 在流媒体传输过程中,当网络中断或者出现波 动时,为确保采集的视频信号不被轻易丢失,服务器 端在进行正常的视频采集与编码传输的同时,以设 定的时间间隔执行checknet()函数自动监测网络, 当返回值为1时表示网络正常,为0则表示网络异 常无法连接。在异常情况下服务器端自动进行本地 视频文件SD卡或者U盘存储,并将视频文件命名 为当前的系统时间。在视频本地存储任务中同样进 行网络监测,当网络恢复正常时,结束视频本地存储 任务,开始继续执行服务器端正常的视频采集与编 码传输。在checknet()函数中首先通过get_netlink— status()函数检测本地网卡与网线是否正常连接,然 后通过与远端客户端的固定端口(客户端在8081 空闲端口始终进行等待连接)进行TCP连接判断网 络是否通畅。 3 结束语 本文给出了一种基于ARM的嵌人式视频采集 与处理系统的设计方案,系统采用新一代视频编解 码标准,在Linux 2.6.32内核操作系统下利用USB 摄像头采集视频,然后对视频数据进行H.264编码 传输,并在网络异常情况下自动转入本地视频存储。 通过对编码器配置文件的修改,降低编码的复杂度, 同时对算法进行优化,经测试,在小尺寸视频格式 下,视频能够比较流畅的传输,单帧静态图像以及动 态图像整体数据量小,图像质量比较优越,能够满足 视频监控尤其是在对带宽要求比较高的场合下实现 视频监控。 参考文献: [1]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电 出版社,2008:3—9. [2]赵苍明,穆煜.嵌入式Linux应用程序开发教程[M].北京:人 民邮电出版社,2009:121—123. [3]余兆明,查日勇,黄磊,等.图像编码标准H.264技术[M].北 京:人民邮电出版社,2006:14—22. [4]毕厚杰.新一代视频压缩编码标准一H.264/AVC[M].北京: 人民邮电出版社,2005:84—110. 责任编辑:刘新影
版权声明:本文标题:基于ARM的视频采集与处理系统的开发 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1702814343h431899.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论