提取DirectShow中视频采集的数据

DirectShow中,数据流(Data Flow)都是依次流过各个Filter的.它对数据的管理也有自己的方法,而且并没有向用户提供一个统一的接口,供用户操作数据流.这里以提取视频采集在的每帧为位图数据为例,说说如何在Directshow中提取数据.

这里我们用到了DirectShow提供给我们的接口ISampleGrabber,并定义了一个供它回调的CSampleGrabberCB对象(继承ISampleGrabberCB接口).

我们知道,DirectShow中的数据存储是通过Sample完成的,所以提取数据也需要通过SampleGrabber.

步骤如下:

1.建立CSampleGrabberCB对象.

   class CSampleGrabberCB : public ISampleGrabberCB 
   {

       STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )

       {

                 //Callback method that receives a pointer to the sample buffer.

       }

      STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample )
      {
               //Callback method that receives a pointer to the media sample.
      }

   }

2.定义ISampleGrabber接口并初始化

   CComPtr< ISampleGrabber > m_pGrabber;

   HRESULT hr;

   hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );

   if(FAILED(hr))

          //error action;

3.定义Grabber Filter,设置它的媒体类型,并将它加入Graph中

   CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );

  CMediaType VideoType;
  VideoType.SetType(&MEDIATYPE_Video);
  VideoType.SetSubtype(&MEDIASUBTYPE_RGB24);
  hr = m_pGrabber->SetMediaType(&VideoType);

  hr = pGraph->AddFilter(pGrabBase,L"Grabber");

4.设置回调(CallBack),使Grabber能够通过BufferCB自动完成采集数据.

   // don't buffer the samples as they pass through
      //
      hr = m_pGrabber->SetBufferSamples( FALSE );

      // only grab one at a time, stop stream after
      // grabbing one sample
      //
      hr = m_pGrabber->SetOneShot( FALSE );

      // set the callback, so we can grab the one sample
      //
      hr = m_pGrabber->SetCallback( &mCB, 1 );  //mCB为CSampleGrabber对象

这样,在DirectShow数据流动过程中,mCB.bufferCB会自动执行,提取Graph中的数据.

时间: 2024-10-19 02:39:49

提取DirectShow中视频采集的数据的相关文章

用DirectShow实现视频采集-流程构建

DirectShow作为DirectX的一个子集,它为用户提供了强大.方便的多媒体开接口,并且它拥有直接操作硬件的能力,这使得它的效率远胜于用GDI等图形方式编写的多媒体程序.前面一篇文章已经对DirectShow作了粗略的介绍,阐述了它的原理及一些编程方法.这里结合实践中运用DirectShow实现视频采集(WIN32)来加深对DirectShow的理解和操作能力. 1.系统环境及开发环境    l       系统支持DirectX(Win 2K以上系统) l       VC++  6.0

(DirectX系列05)DirectShow 视频采集

    前几小节陆续介绍了Directsound.Directshow音频处理方面的技术,还没有介绍视频方面的技术,从这节开始介绍视频采集方面的技术.今日刚好就介绍Directshow视频采集技术,其实DirectShow视频采集并不复杂,复杂的部分微软已经帮做好了,只需按照顺序将API连接起来即可,如下所叙述: 系统设备枚举     系统设备枚举器为我们按类型枚举已注册在系统中的Fitler提供了统一的方法.而且它能够区分不同的硬件设备,即便是同一个Filter支持它们.这对那些使用Windo

libmad-提取mp3中真正的音频数据

问题描述 提取mp3中真正的音频数据 用libmad解码,运行./minimad 输出乱码显示decoding error 0x0101(lost synchronization)然后安装了zlib和libid3tag ,这时应该这样修改minimad.c把后面加装的两个库加进去.目地是想获得音频数据(如果数据是十进制或十六进制的更好),最终目地是通过音频数据控制灯光的闪烁(像舞台灯光). 解决方案 内维尔戈达德.最好的内维尔戈达德音频MP3电子书.ffmpeg提取音频.转换为mp3

celiometer可以采集的数据很少,meter表的配置在哪

问题描述 安装和部署完ceilometer后,我的meter表中可以采集的数据很少,在官方文档上看到的采集项都没有,比如cpu和cpu的使用都没有,请问是要哪里配置吗?还是其他原因 解决方案 解决方案二:同楼主问题,目前采集不到任何nova相关的数据...解决方案三:建议阅读ceilometer的文档.文档里肯定有如何配置的说明.有事找文档.

入门视频采集与处理(学会分析YUV数据)

做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始YUV码流进行编码和解析,所以,了解如何分析YUV数据流对于做视频领域的人而言,至关重要.本文就是根据我的学习和了解,简单地介绍如何分析YUV数据流.     YUV,分为三个分量,"Y"表示明亮度(Luminance或Luma),也就是灰度值:而"U"和"V

android中如何将视频采集到缓冲区中

问题描述 android中如何将视频采集到缓冲区中 我打算先通过摄像头将视频采集到缓冲中,然后再从缓冲中读取数据 解决方案 视频采集这块的 我记得自己有demo

探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页

探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的一表的部分数据结构: CREATE TABLE [dbo].[TGongwen] (    --TGongwen是红头文件表名    [Gid] [int] IDENTITY (1, 1) NOT NULL ,--本表的id号,也是主键    [title] [varchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,  --红头文件的

MFC怎样提取字符串中两个逗号之间 的数据

问题描述 MFC怎样提取字符串中两个逗号之间 的数据 比如字符串: "$GPGGA,024055.00,4002.2168,N,11618.1074,E,1,12,0.0,75.88,M," 怎样提取两个逗号之间的数据,例如"4002.2168"? 我试着使用例如 .Mid(17,14)函数,但是并不好用,因为字符串的长度经常会改变. 解决方案 先用CString的Find找到前后两个逗号的位置,然后在用Mid来截取.这样就可以适应动态变化的字符串 解决方案二: 参

VB6.0 COM串口程序采集的数据怎么在Plot曲线控件中实时显示,求各位大神了!谢谢

问题描述 VB6.0 COM串口程序采集的数据怎么在Plot曲线控件中实时显示,求各位大神了!谢谢 RT,VB6.0 编写好COM串口程序采集的数据怎么在Plot曲线控件中实时显示,求各位大神了!谢谢 解决方案 用VB的话还是MSChart比较好用.串口得到数据按照一定的协议解析后直接绑定到控件上就可以了. 解决方案二: http://wenku.baidu.com/link?url=dzFdj7tuMl4yr5NZUIooA2zAwZ5NpT8N8y6P6Z8c7T0k0GQRnOKGa95M