主页(http://www.pttcn.net):基于AVI的网络视频监控存储系统实现方法
1.网络视频监控系统介绍 网络视频监控系统是一个基于客户机/服务器模型的系统,由视频服务器端和客户端组成。视频服务器是一个由SAA7113、PNX1301、RTL8139等组成的嵌入式系统,SAA7113实现视频的采集;PNX1301是系统的核心,对视频数据进行处理,如视频编码、报警检测、云镜控制等;RTL8139负责数据传输,数据通过网络与客户端交互。 客户端是一台通用计算机,客户端有选择性地连接单个或者多个服务器,经过身份验证后可以向监控服务器发送命令,从监控服务器获取压缩视频流和其他测量数据,从而实现远程视频监控。 系统采用XVID视频编解码器对图像数据进行压缩,因为XVID开放源码,可以将它移植到PNX1301的PSOS操作系统中,对图像数据进行编码;客户端计算机从网络接收压缩的视频数据,使用相同版本的XVID解码器解码,即可得到图像数据。 2.XVID视频压缩格式 2.1.XVID的特点 XVID支持多种编码模式,除了最原始单重估定码流压缩(1-passCBR)之外,XVID提供了包括:单重质量模式动态码流压缩、单重量化(Quantization)模式动态码流压缩、和包括外部控制和内部控制的两种双重(2-pass)动态码流压缩模式。 XVID的运动侦测(MotionSearch)特性,为需要高码流的运动画面可以分配更多空间、更高的码流、更低的量化幅度来保持画面的细节;而对于不包含太多运动信息的静态画面,则消减分配预算。这是XVID做为第二代MPEG4编码的核心内容。 XVID支持动态关键帧距(I-frameinterval)和B帧,即双向预测帧。此外还支持心理视觉亮度修正、演员表选项。画面优化解码等。 2.2.XVID的编解码实现方法 XVID源码有三部分构成:xvidcore、vfw、dshow,可以用MicrosoftVisualC++和NASM编译。本文使用MicrosoftVisualC++2003.net和NASM-0.98.39编译成功,其中编译dshow项目还需要安装DirectX9.0SDK。 xvidcore工程生成XVID编解码器的API函数库:xvidcore.dll;vfw工程生成XVID编解码器在Windows下的安装文件:xvidvfw.dll和xvid.inf;dshow生成XVID在Windows下注册文件:xvid.ax。 由于本文的XVID编码部分在PNX1301中实现,在此只介绍XVID的解码部分。 1)加载xvidcore.dll库函数 使用XVID的API函数需要加载xvidcore.dll库,并包含vfw.h和xvid.h头文件,调用API函数的方法如下: HINSTANCEm_hdll=LoadLibrary("xvidcore.dll"); xvid_global_func=(int(__cdecl*)(void*,int,void*,void*))GetProcAddress(m_hdll,"xvid_global"); xvid_decore_func=(int(__cdecl*)(void*,int,void*,void*))GetProcAddress(m_hdll,"xvid_decore"); 2)初始化编解码器 xvid_global_func(0,XVID_GBL_INIT,&init,NULL); 3)创建解码器 intlength=xvid_decore_func(0,XVID_DEC_CREATE,&create,NULL); 4)结果输出设置 xvid_dec_frame_t结构是解码的主要参数,其中输出部分需要设置输出缓冲区、步长和输出类型,在颜色深度是24位的情况下,RGB格式的数据步长为图像宽度的3倍。 frame.output.plane[0]=ostream; frame.output.stride[0]=CALC_BI_STRIDE(width,24); frame.output.csp=XVID_CSP_VFLIP|XVID_CSP_BGR; 5)解码 intlength=xvid_decore_func(dhandle,XVID_DEC_DECODE,&frame,&stats); 3.利用AVI格式存储视频 AVI(AudioVideoInterleaved的缩写)是一种RIFF(ResourceInterchangeFileFormat的缩写)文件格式,用于音视频捕捉、编辑、回放等应用程序中。通常情况下,一个AVI文件可以包含多个不同类型的媒体流(典型的情况下有一个音频流和一个视频流),不过含有单一音频流或单一视频流的AVI文件也是合法的。AVI可以算是Windows操作系统上最基本的、也是最常用的一种媒体文件格式。 3.1.AVI视频文件结构 ’avih’:文件信息(AVIFILEINFO格式),’strh’:数据流信息(AVISTREAMINFO格式),’strf’:格式化信息(BITMAPINFO格式)。 3.2.安装XVID编解码器 在Windows下使用XVID编解码器,需要安装XVID编解码器。
3.3.存储AVI视频文件 微软提供了一套API对AVI文件进行读写,使用这些库函数需要在程序中加载vfw32.lib库和vfw.h头文件。本文的对AVI文件的操作都使用此库中的函数。 如果要对数据流进行压缩,可以使用AVISaveOptions和AVIMakeCompressedStream函数,选择操作系统中已经安装的视频编解码器。由于本文从视频服务器得到的是已经编码的XVID格式数据流,所以不需要这个步骤。 3.3.1.获取原始数据 首先获取帧数据的长度,然后获取文件中的原始数据。 AVIStreamRead(pVideoStream,lFrames,AVISTREAMREAD_CONVENIENT,NULL,0,&lSize,NULL);
AVIStreamRead(pVideoStream,lFrames,AVISTREAMREAD_CONVENIENT,pBuffer,lSize,NULL,NULL);
|