专业的信息化与通信融合产品选型平台及垂直门户
注册 登陆 设为首页 加入收藏
首页 企业新闻 招标信息 行业应用 厂商专区 活动 商城 中标信息

资讯
中心

新闻中心 人物观点
厂商专区 市场分析
行业
应用
政府机构 能源产业 金融机构
教育科研 医疗卫生 交通运输
应用
分类
统一协作 呼叫客服 IP语音 视频会议 智能管理 数据库
数字监控 信息安全 IP储存 移动应用 云计算 物联网

TOP

基于AVI的网络视频监控存储系统实现方法
2013-09-30 11:58:32 来源:互联网 作者:【
关键词:网络视频 监控存储
 
随着Internet和宽带网络技术的日益发展,具有视频和音频的多媒体内容服务即将成为主流。同时,各种高效压缩解压算法的提出,为多媒体信息在网络上进行传输提供了可能。

  1.网络视频监控系统介绍 
  随着Internet和宽带网络技术的日益发展,具有视频和音频的多媒体内容服务即将成为主流。同时,各种高效压缩解压算法的提出,为多媒体信息在网络上进行传输提供了可能。网络视频监控以直观、方便、信息内容丰富等特点被广泛应用于许多场合。

    网络视频监控系统是一个基于客户机/服务器模型的系统,由视频服务器端和客户端组成。视频服务器是一个由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编解码器。


222222安装需要前面提到xvidcore和vfw项目生成的三个文件xvidcore.dll、xvidvfw.dll和xvid.inf,使用方法是右键点击xvid.inf文件选择“安装”命令即可。

    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);

    原始数据为压缩数据,可以直接调用XVID的API函数对其进行解码得到图像数据。

    3.3.2.获得RGB格式的数据

    使用AVI的API函数可以直接自动调用XVID解码器,获得RGB格式的数据。

    1)获取格式化信息

    先获取格式的大小,可由此判断数据流是视频流还是音频流。

    AVIStreamReadFormat(pVideoStream,AVIStreamStart(pVideoStream),NULL,&lSize);

    获取格式化信息内容,如果是视频流则转化为BITMAPINFO格式,即可获取格式化的具体信息,如图像的大小,压缩方式,颜色深度,缓冲区大小等。

    AVIStreamReadFormat(pVideoStream,AVIStreamStart(pVideoStream),pChunk,&lSize);

    LPBITMAPINFOpInfo=(LPBITMAPINFO)pChunk;

    2)设置结果的信息头

    这里我们想得到RGB格式的数据流,原始数据格式为XVID格式,这里我们只需要改变原始格式的压缩方式和缓冲区大小就可以了。缓冲区的大小计算公式如下,它的大小和相同大小的BMP图像数据大小是相等的。

    LPBITMAPINFOHEADERpBmpih=GetStreamFormat();

    pBmpih->biCompression=BI_RGB;

    pBmpih->biSizeImage=((pBmpih->biWidth*pBmpih->biBitCount+31)/32*4)*pBmpih->biHeight;

    3)获取RGB格式化数据流,如果pBmpih为空,将到原始数据

    PGETFRAMEpVideoFrame=AVIStreamGetFrameOpen(pVideoStream,pBmpih);

    4)获取RGB数据,获得的RGB数据包括40字节的图像格式信息

    LPBYTEpImage=(LPBYTE)AVIStreamGetFrame(pVideoFrame,lFrames);

    pImage=pImage+sizeof(BITMAPINFOHEADER);

    3.4.AVI视频播放

    如果操作系统没有安装XVID编解码器,播放器无法识别XVID格式的AVI文件。解决的方发是使用如上文的安装方法,或者使用dshow生成的xvid.ax注册文件。

    注册方法是在命令行输入:

    “/system/regsvr32/xvid.ax”

    例如:“C:/windows/system/regsvr32C:/ProgramFiles/xvid.ax”,然后复制xvidcore.dll到“/system32”,如:“C:/windows/system32”。测试是否安装成功的方法是播放一段XVID片断,看播放器是否正常工作。

    本文使用三种方法对播放XVID视频进行测试,都工作正常。一是利用xvidcore.dll、xvidvfw.dll和xvid.inf,然后安装xvid.inf,使用WindowsMediaPlayer播放;二是xvidcore.dll和xvid.ax,注册xvid.ax,使用WindowsMediaPlayer播放;三是安装暴风影音,使用暴风影音的XVID编解码器,用暴风影音播放。

    4.结论

    利用AVI文件存储XVID格式视频流完全可行,由于大部分播放器支持A

      

责任编辑:admin
免责声明:以上内容转载互联网平台或企业单位自行提供,对内容的真实性、准确性和合法性不负责,Voipchina网对此不承担任何法律责任。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部

上一篇激光热成像高质量视频监控 专用于..
下一篇十一黄金周 成都多条高速启动高清..

热门文章

图片主题

最新文章

相关文章

广告位

Copyright@2003-2009 网络通信中国(原VoIP中国) 版权所有
联系方式:503927495@qq.com
  京ICP备05067673号-1 京公网安1101111101259