主页(http://www.pttcn.net):基于AVI的网络视频监控存储系统实现方法(2) 原始数据为压缩数据,可以直接调用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 (中国集群通信网 | 责任编辑:陈晓亮) |