分享
 
 
 

利用VC实现AVI文件的图像截取

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

作者: 刘涛

来源:www.yesky.com

AVI文件就是我们所说的多媒体文件,所谓的AVI图像就是视频图像,该文件是一个RIFF说明文件,它用于获取、编辑、演示音频、视频序列。一般的AVI文件包含音频流和视频流,有的特殊的AVI还包含一个控制路径或MIDI路径作为附加的数据流。

现在播放AVI文件的软件很多,但大多无法从AVI视频文件中读取一帧图像并生成BMP格式的文件。笔者在使用AVI文件开发项目过程中对AVI文件的操作积累了一些经验,对于如何实现从AVI视频流中获取任意帧的图像数据并存储成BMP文件,其中最关键的是要从AVI文件中获取具体某一帧的图像数据,为此我利用Windows提供的API函数实现了自定义的CAvi类,用于操作AVI文件。

在使用API函数操作AVI文件时,一定要注意用AVIFileInit()来初始化AVI库,程序结束时用AVIFileExit()释放AVI库,否则API函数无法使用。现以操作包含真彩色图像的AVI文件为例,给出Cavi类的部分函数的具体实现,其中CaviCreate()函数用于读取AVI文件信息并初始化Cavi类的成员,例如根据AVI文件信息定义每帧图像的宽、高、每帧图像的信息头结构等等;函数AviRead(int mFrame)用于从AVI文件中读取第mFrame帧。实现代码显示如下:

//Cavi类头文件定义;

class CAvi file://AVI类,处理AVI文件

{

public:

int cy;//图象高

int cx;//图象宽

file://long m_maxFrame;

BYTE *pData;//寸储图象数据

BITMAPINFO *m_pBMI;//位图文件信息头

PAVISTREAM pavi;//AVI流

PAVIFILE pfile;//AVI文件指针

AVIFILEINFO * pfi; file://AVI信息

BOOL AviRead(int mFrame);//读AVI文件的第mFrame帧

CAvi();//标准构造函数

CAviCreate(CString &string);//用文件名初始化AVI类的成员

virtual ~CAvi();

};

//Cavi类文件实现部分;

CAvi::CAvi()

{ AVIFileInit();//初始化AVI库

cx=0;//定义图象宽、高、等成员

cy=0;

m_pBMI=NULL;

pData=NULL;

file://m_maxFrame=0;

pfi=NULL;

}

CAvi::~CAvi()//析构、释放指针

{

// AVIFileClose(pfile);

AVIFileExit();

if(pData!=NULL)

delete pData;

pData=NULL;

if(m_pBMI!=NULL)

delete m_pBMI;

m_pBMI=NULL;

if(pfi!=NULL)

delete pfi;

pfi=NULL;

}

CAvi::CAviCreate(CString &string)//读文件初始化该类

{

HRESULT hr;

pfi=new AVIFILEINFO;

hr = AVIFileOpen(&pfile, // returned file pointer

string, // file name

OF_READ, // mode to open file with

NULL);

hr= AVIFileInfo(pfile, file://获取AVI信息,放入pfi中

pfi,

sizeof(AVIFILEINFO)

);

cx=pfi->dwWidth;//图象宽、高

cy=pfi->dwHeight;

hr=AVIFileGetStream(//将AVI变成视频流

pfile,

&pavi,

streamtypeVIDEO,

0//LONG lParam

);

m_pBMI=new BITMAPINFO;//定义BMP信息头

m_pBMI->bmiHeader.biBitCount=24;

m_pBMI->bmiHeader.biClrImportant=0;

m_pBMI->bmiHeader.biClrUsed=0;

m_pBMI->bmiHeader.biCompression=BI_RGB;

m_pBMI->bmiHeader.biHeight=cy;

m_pBMI->bmiHeader.biWidth=cx;

m_pBMI->bmiHeader.biPlanes=1;

m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);

m_pBMI->bmiHeader.biXPelsPerMeter=0;

m_pBMI->bmiHeader.biYPelsPerMeter=0;

m_pBMI->bmiHeader.biSizeImage=cx*cy*3;

pData=(BYTE*)new char[cx*cy*3];//根据AVI中BMP图象的信息定义缓冲区

}

BOOL CAvi::AviRead(int mFrame)//将AVI文件的M帧数据读入PData缓冲区

{

HRESULT hr;

hr= AVIStreamRead( pavi,

mFrame,

1,

pData,

cx*cy*3,

NULL,

NULL

);

if(hr==0)

return TRUE;

else

return FALSE;

}

上述Cavi类实现部分所涉及到的API函数可以参考微软提供的MSDN。Cavi类中的pData缓冲区存放AVI文件中的具体某一帧图像数据,同时Cavi类的m_pBMI为BMP图像文件信息结构,这时可以根据图像的大小定义BMP图像文件头结构,关于BMP文件的存储,由于篇幅的原因,我不在多讲了,有兴趣的读者可以参见笔者的拙作"Visual C++6.0开发灰度位图处理"(天极网软件栏目2001.9.10发表),该文里面讲述了如何存取BMP文件。以上程序在Windows2000、Visual C++6.0环境下顺利编译通过,运行正常。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有