基于VFW的AVI视频文件压缩与解压缩方法研究
摘 要:本文首先概述了微软数字视频软件开发包VFW(Video For Windows)的内容与其体系结构,然后针对AVI文件结构进行必要性分析,接着重点讲述如何使用VC++编程技术调用VFW库函数对AVI文件中视频数据进行压缩与解压缩处理,并给出了相关函数或代码。
关键词:VFW;AVI;VC++;压缩;解压缩
1. 引言
VFW(Video for Windows)是Microsoft推出的关于数字视频的一个软件开发包,VFW的核心是AVI文件标准。围绕AVI文件,VFW推出了一整套完整的视频采集、压缩、解压缩、回放和编辑的应用程序接口(API)。VFW接口主要包括多个动态连接库,通过这些组件间的协调合作,来完成视频的捕获、视频压缩及播放功能。
本文主要通过VC++编程技术调用其中的和ICM,以实现对AVI文件中视频数据的压缩、解压缩以及播放操作,并经过几组实验得到了较好的效果。
2. AVI文件的结构
AVI文件所采用的RIFF(Resource Interchange File Format,资源互换文件格式)文件结构是由4字节的数据块标记FOURCC(four -character code) ‘AVI’所标识;且包含一个ID为""hdrl""的LIST信息块,其主要用于定义AVI文件的数据格式,记录着视频音频的格式参数信息;还包含一个ID为 ""movi""的LIST数据块,其记录着AVI的音视频序列数据,而对于视频流来说,其子块中包含各帧视频图像的数据内容;最后RIFF文件结构包含一个ID为 ""idxl""的索引块,其包含数据块在文件中的位置索引,能有效提高AVI文件的读写速度,当然这部分是可选的。
3. AVI文件中视频数据压缩方法
我们知道,以未压缩格式存储的AVI视频文件的体积很大。一方面这样会占用大量的硬盘空间;另一方面受限于网络带宽的因素,大体积的AVI视频文件也不便于在互联网络中进行顺畅传输。为此,对AVI视频文件进行有效地压缩处理成为了人们必须要考虑的研究点。微软的VFW库中也包含了这方面的库函数,便于编程人员方便地对AVI视频数据进行压缩处理。下面本文介绍一种通过调用VFW中相关库函数实现压缩AVI视频数据的方法。
首先与前边介绍的读取方法一样,使用相关库函数获取一个未压缩AVI视频文件的pgf; 然后调用VFW中为方便用户所提供的“选择压缩器对话框”函数ICCompressorChoose(m_hWnd,ICMF_CHOOSE_KEYFRAME,&bmpinfo_input,NULL,&m_Com,""选择压缩类型"");来选择一个我们需要的目标压缩编码方式。该函数中bmpinfo_input即为前边所述,使用AVIStreamReadFormat函数返回的BITMAPINFO类型的结构体变量,其描述着原始视频数据的格式信息。当用户选择完目标压缩器后,相关设置信息将会被自动填充到里面的m_Com中,该变量为COMPVARS类型的结构体。接着利用前边m_Com中的目标压缩器句柄以及bmpinfo_input中的BITMAPINFOHEADER结构体变量,调用ICCompressGetFormat函数返回一个目标视频压缩数据的格式信息,这里以类型为BITMAPINFO的结构体变量m_OutInfo存储。正确完成前边的设置操作后,则执行下面的函数完成压缩数据所需的初始化操作,
ICCompressBegin(,(BITMAPINFO*)&bmpinfo_input,(BITMAPINFO*)m_OutInfo);
最后我们再调用如下函数完成一帧视频数据的压缩操作,
ICCompress(,0,&m_OutInfo->bmiHeader,compress_data,& der, origin_image,& dwCkID, dwCompFlags,0,0,100,NULL,NULL);
其中,compress_data为压缩后的当前帧数据,其应在使用ICCompress前执行如下函数申请内存空间:
BYTE *compress_data = (BYTE *) new BYTE. 计算机工程与
设计,2007,28(1)
.Microsoft Corporation,2001
上一篇:试论新疆纪录片的发展沿革