一种基于H264编码的嵌入式远程监控系统的制作方法

文档序号:12136117阅读:377来源:国知局
一种基于H264编码的嵌入式远程监控系统的制作方法与工艺

本发明属于安全防护领域,涉及到视频压缩传输技术,更确切的说是一种基于H264编码的视频压缩传输技术。



背景技术:

以一张中等分辨率的图片(分辨率为800*600,24比特每像素)为例,则每采取这样一副图片所需要的比特数为600"800"24=11.52Mb(兆比特),大约占1.4MB(兆字节)的存储空间。如果按照30fps(帧每秒)的帧率来计算,每秒钟需要传输的数据量为345.6Mb。如果作为多媒体信息由计算机来处理,则无论从总线传输速率、数据存取和交换速率还是网络传输速率,目前都无法达到如此高的要求。图像只有必须经过数据压缩处理,计算机才有可能具备处理这种信息的能力。

为了实现各种网络和多媒体系统的互通互联,解决视频信息与用户交互的问题,关键在于产生一种新的视频压缩算法,对视频信息进行更为有效的压缩,使其压缩后的码流能够满足用户在当前网络环境下进行的实时传输处理种存储。

作为模拟或者数模混合信号电路的基本模块,模拟基准电压源的主要功能就是为电路提供稳定的偏置,因此基准电压源的性能将直接影响整个电路系统的精度和性能。随着集成电路规模的不断扩大,以及便携式电子系统的普遍应用,使基准电路再被广泛应用的同时,也对它的性能提出了更高的要求。

H264就是基于这个背景下产生的新一代视频压缩编码国际标准,它是由国际电信联合会ITU视频编码专家组VCEG和国际化标准组织运动图像专家组MPEG共同组成的联合视频组JVT联合制定的,凭借相对其它标准有较高的压缩效率和优秀的图像质量,已经成为目前最流行的视频处理协议,具有广阔的前景和巨大的应用价值。

目前,H.264的开源解码器软件主要有:德国HHI研究所负责开发的H.264官方测试软件JM,由法国巴黎中心学校的中心研究所的学生发起的,网上自由 组织联合开发的兼容264标准码流的编码器x264,以及中国视频编码自由组织联合开发T264等。对比之下,x264注重实用,在不明显降低编码性能的前提下,努力降低编码的重复计算复杂度,摒弃了H.264标准中一些对编码性能贡献微小但计算复杂度极高的新特性如多参考帧。所以我们采用x264版本的H264编码库。

尽管具有以前很多标准无法比拟的优点,但H.264标准复杂度高,用一般的图像处理芯片难以达到实时编解码的要求。当前,主流式嵌入式平台(ARM,DSP)的发展很大程度上解决了这个问题。目前,基于单片嵌入式处理器的解决方案主要有基于ARM+DSP的双核处理器,它以美国德州仪器公司(TI)的OMAP系列处理器为主流,使用ARM复杂系统运行,使用DSP核用于视频解码,特别将H.264在高速DSP平台上实时实现是当前图像通信研究领域的一个热点问题。同时,由于ARM芯片的多媒体处理能力增强,利用ARM实现H.264也成为现实。以英特尔公司(Intel)的XscalePXA27x系列为主流,从工艺、指令集、流水线、存储系统、分支预测、多媒体应用这五个方面对ARM进行了改进和优化,大大提升了处理器的多媒体处理能力。



技术实现要素:

本发明主要采用了ARM9的S3C2440,将linux与H.264相结合,实现x264和ffmpeg的移植,对实际嵌入式视频通信系统的设计开发,具有重要意义和实用价值。

本发明的技术方案为:对于ARM平台从软件的角度看可以分为4个部分:1、引导加载程序,包括固化在固件中的boot代码和BootLoader两大部分,我们需要完成该部分代码的移植。2、Linux内核,特定于嵌入式板子的定制内核以及内核的启动参数,我们需要将Linux内核编译移植到我们开发板上。3、文件系统,包括根文件系统和建立于Flash内存设备之上文件系统。通常用Busybox来作为rootfs,yaffs作为Flash上的文件系统。4、用户应用程序,需要编写特定于用户的应用程序,完成对视频的压缩和传输。对于PC客户端,我们需要在客户端设计基于ffmpeg来实现一个多路H.264解码播放器。从而实现对视频的实时监控。对于视频采集端,我们在开发板上连接一个USB摄像头,该摄像头在ARM开 发板的驱动下即可完成对视频的采集。

附图说明

图1为整个视频系统的结构图。

图2为在ARM建立视频压缩传输平台的流程。

图3为本发明在电脑端监视主程序的实现流程。

具体实施方式

首先在宿主机上建立交叉编译环境,其次移植linux的引导程序到目标板,然后构建嵌入式Linux系统并移植到目标板,从而实现视频压缩处理传输模块,最后,用VC6.0的基础类库MFC(Microsoft Foundation Classes),设计基于ffmpeg的H.264解码播放器,将播放器放在PC机上,开发板接上摄像头,就可以实现视频监控功能。

下面对本发明进行详细描述。

由图1我们知道我们需要在ARM平台上进行视频数据的H.264压缩,并进行传输,由图2则我们需要在ARM平台完成以下几部分工作:a.移植uboot加载程序。b.移植Linux内核,构建可在ARM平台上运行的嵌入式系统。c.移植文件系统,使操作系统可以正常运转,通常用BusybOX来作为rootfs,yaffs作为nandflash的文件系统。d.编写用户应用程序,即实现对视频的压缩及压缩后的数据传输。则这一部分实现具体步骤如下:

首先,移植uboot需要完成以下步骤:a.设置入口指针以及中断向量表b.屏蔽所有中断,关看门狗c.设置工作时的CPU和时钟频率d.初始化存储控制相关寄存器e.关闭MMU和Cachef.启动方式的选择g.初始化各模式下的栈指针将数据段拷贝到RAM中,将零初始化数据段清零i.跳转到C语言Main入口函数中。完成以上几步以后,则完成了对uboot引导程序的移植,为移植Linux打好了基础。

然后,移植Linux内核需要完成以下步骤:

编辑Makefile文件:进入解压的目录后,运行命令:vi Makefile找到“CROSS-COMPILE=”这行,将它改为CROSS-COMPILE=arm-linux-设置好后保存退出。

配置内核:输入make menuconfig进入内核配置界面,选择我们需要的内核功能。本发明中需要支持USB摄像头和网卡芯片DM9000,我们将它们的选项改为Y,则内核会支持该功能。选择好后保存并退出配置界面。

编译内核:输入命令make zImage则将得到linux内核压缩映像zImage,然后将zImage下载并固化在目标板的Flash中,实现内核的移植。

其次,移植文件系统,我们需要完成以下基本步骤:

准备根文件系统:在机器上建立rootfs的文件夹mkdir rootfs,在rootfs中建立linux系统中典型的文件夹#cd rootfs:#mkdir root home bin sbin etc dev usr lib tmp mnt sys proc,#mkdir usr/libusr/bin#pwd/home/su/rootfs。

解压源码包并修改Makefile:#tar xzvf busybox-1.13.3.tgz#cd busybox-1.13.3,将Makefile中的CROSS COMPILE=改为CROSS COMPILE=arm-1inux-。

定制busybox设置静态编译方式:选择busybox下全部的可执行程序#make defconfig,然后再Busybox Settings…>Build Options…>Build Busybox as a static binary,Busybox Settings…>Install Options…>中输入建立根文件系统的文件所在的路径/home/rootfs,其它的默认,确保Build Busybox as a static binary(no shared libs)被选中,保存退出。

执行make编译:#make编译通过,busybox被生成了,然后执行#make install。

至此,我们的文件创建移植已经完成。

最后,编写用户应用程序,我们需要完成对H.264的移植需要以下步骤。

交叉编译x264:

将x264程序拷贝到Linux系统,运行x264所在目录下的configure脚本进行配置,设置编码器和库文件安装路径、目标系统类型(Linux或Windows)、指定编译工具链和编译选项等。输入CC=arm-linux-./configure会在当前目录生成config.mak文件,然后调用make开始编译,紧接着make install安装二进制程序代码,这里需要管理员root的身份,这样就能够得到目标平台处理器格式的二进制可执行文件x264。

x264参数配置:

本发明选择基本档次:利用I片和P片支持帧内和帧间编码,支持利用基于上下文的自适应的变长编码进行的熵编码(CAVLC)。主要用于可视电话、会 议电视、无线通信等实时视频通信。

由图3可知,我们需要在电脑监控端最终实现视频数据的解码压缩,则需要以下几个过程。

首先,网络通信编程:

本发明程序设置的打开文件可以是网络传输的H264视频流或者本机的.H264文件。程序默认是打开网络传输的视频流,这里采用了Winsock进行网络编程。Windows Soceket API是TCP/IP网络环境里,也是Intetnet上进行开发最为通用的API。基于TCP的编程是采用的流式套接字。客户端编程的步骤:首先加载套接字库,创建套接字。然后,向服务器发出连接请求。其次,和服务器端进行通信。最后关闭套接字,关闭加载的套接字库。

然后,就是如何解码播放x264文件。本发明采用的是用SDL作为视频输出对象,ffmpeg完成对.H264视频的解码。

初始化SDL是通过SDLinit()函数来实现的。如果初始化失败,函数返回值为0。函数只接受初始化对象作为参数。如果要初始化视频屏幕,传入常数SDL_INIT_VIDEO作为参数。本发明使用函数SDL-SetVideoMode(width,height,0,SDL-HWSURFACE I SDL_DOUBLEBUF)来设置屏幕分辨率。前三个参数分别为屏幕宽度,高度和屏幕上的每象素包含的位数(bits per pixel,BPP)。如果填入0则SDL自动选择最合适的BPP。第四个参数用来给出某些特殊标志位。SDL有很多方法实现视频的输出,本发明采取的是YUVoverlay。其流程是首先创建一个surface用来显示视频数据,然后创建一个overlay,这样就可以通过overlay输出视频到surface。

最后,是解码播放,这里调用ffmpeg中的decode thread()进行解码。这个线程从视频队列中读取包,把它解码成视频帧,然后调用queue picture()函数把处理好的帧放入到图片队列中。接着就是将解码后的帧pFrame保存到图像队列中。因为我们的图像队列是SDL的覆盖的集合,我们需要把帧转换成相应的格式。

我们需要申请SDL Overlay保存这些缓冲区。为了使用这个队列,需要两个指针:写入指针和读取指针。要写入到队列中,我们先要等待缓冲清空以便于有空间来保存VideoPicture。然后程序将检查是否已经申请到了一个可以写入覆盖的索引号。如果没有,就申请一段空间。如果播放窗口的大小已经改变,也要重新申请缓冲。

由以上步骤,播放器首先通过网络通信,对ffmpeg和SDL进行初始化,然后“打开数据流″部分负责识别文件格式为.H264文件和读取文件内部的压缩数据,解码音频流、视频流。最后系统进入该循环,等待接收数据处理数据。最终完成对视频数据的解码显示。

综上所述,本发明提出了一种基于H264编码的嵌入式远程监控系统,在视频传输效率提高,同时降低传输视频数据量提高传输速度方面完成的很好。由于降低了对整个系统的要求以及资源的消耗,所以我们可以在成本更低的嵌入式系统上完成视频采集压缩过程,从而大大降低了成本。并且由于处理器并未被大量占用,所以我们还可以在同一个系统上扩展其他功能而并不会影响系统响应速度,从而为整个系统向后扩展留下了更大的余地,为以后的扩展系统功能的设计者留下了更大的设计空间。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1