CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  游戏开发

视频抓取问题

楼主LanceX(小军)2002-08-02 15:23:02 在 专题开发/技术/项目 / 游戏开发 提问

请问如何在win2000下创建一个视频窗口(假设视频设备已安装好,并正确安装了驱动程序)  
  可以动态显示视频图像并可保存当前图像。 问题点数:100、回复次数:6Top

1 楼wistaria(听风听雨)回复于 2002-08-02 16:52:59 得分 0

http://www.5xsoft.com/data/200110/2308450701.htm  
  利用   VC   实现AVI文件的图像截取  
   
  [   作者:   刘涛       添加时间:   2001-10-23   8:48:00   ]  
  来源: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环境下顺利编译通过,运行正常。    
  Top

2 楼czylj(夭夭)回复于 2002-08-02 18:09:59 得分 10

http://www.csdn.net/expert/topic/917/917224.xml?temp=.8278925Top

3 楼LanceX(小军)回复于 2002-08-05 12:30:54 得分 0

感谢wistaria(听风听雨)的回贴,但是我要的不是avi的制作,而主要是视频窗口的建立,和相应如视频模式,灰度,亮度等的调整。我的分数随时恭候。Top

4 楼xdspower(杂食菜熊)回复于 2002-08-13 09:14:47 得分 30

使用ms   media   encoder   sdkTop

5 楼99263()回复于 2002-08-13 14:02:56 得分 30

如果需要,我可以给你一份例程,是VFW(Video   For   Window)的,非常简单。  
   
  如果你用DirectShow的话,就稍微复杂一些。Top

6 楼likevclinux(流浪的小狗)回复于 2002-08-21 11:09:55 得分 30

小弟决定在写一遍解决它Top

相关问题

  • 求视频抓取程序(要C#的)
  • pb 如何实时抓取视频图像啊
  • 视频抓取问题。急!急!急!望各位大侠出手相助
  • 请高手赐教,能不能在C#中用directshow抓取视频中的桢?
  • 如何使用Windows Media Encoder抓取摄象头视频并且保存为视频文件??
  • 视频抓取的深层问题。急!急!急!望各位大侠出手相助
  • 我有摄像头和麦克风,请问哪个软件能同时抓取视频和音频,即录制有声视频文件?
  • 图象抓取
  • 网页抓取
  • 远程控制时,如何抓取远程计算机桌面上正在播放的媒体流,即电影视频

关键词

  • visual c++
  • 文件
  • 图像
  • 函数
  • 数据
  • hr
  • cavi
  • avi
  • pbmi
  • pfi

得分解答快速导航

  • 帖主:LanceX
  • czylj
  • xdspower
  • 99263
  • likevclinux

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo