提取DirectShow中视频采集的数据

简介: <p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">DirectShow中,数据流(Data Flow)都是依次流过各个Filter的.它对数据的管理也有自己的方法,而且并没有向用户提供一个统一的接口,供用户操作数据流.这里以提取视频采集在的每帧为位图数据为例,说说

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中的数据.

相关文章
|
开发工具 图形学 git
Unity 之 加载工程卡在音频处不动(Unity识别不出音频文件)
在Git上克隆同事上传的工程,打开是卡在音频处不动解决方案分享。
664 0
Unity 之 加载工程卡在音频处不动(Unity识别不出音频文件)
|
2月前
|
编解码 API 数据处理
【摄像头数据处理】摄像头数据处理:使用FFmpeg合并、编码和封装视频流
【摄像头数据处理】摄像头数据处理:使用FFmpeg合并、编码和封装视频流
57 0
|
6月前
|
存储 Cloud Native Linux
音视频 ffmpeg命令提取PCM数据
音视频 ffmpeg命令提取PCM数据
|
10月前
|
编解码 监控 开发工具
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
63 0
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
|
API 计算机视觉
V4L2抓取USB摄像头YUV视频数据代码
V4L2抓取USB摄像头YUV视频数据代码
233 0
|
编解码 Android开发 C语言
【Android 高性能音频】AAudio 音频库 简介 ( AAudio 音频库简介 | 音频流 | 音频设备 | 共享模式 | 数据模式 )
【Android 高性能音频】AAudio 音频库 简介 ( AAudio 音频库简介 | 音频流 | 音频设备 | 共享模式 | 数据模式 )
656 0
|
算法
【音频处理】Melodyne 导入音频 ( 使用 Adobe Audition 录制音频 | 在 Melodyne 中打开录制的音频 | Melodyne 对音频素材的操作 | 音频分析算法 )
【音频处理】Melodyne 导入音频 ( 使用 Adobe Audition 录制音频 | 在 Melodyne 中打开录制的音频 | Melodyne 对音频素材的操作 | 音频分析算法 )
785 0
【音频处理】Melodyne 导入音频 ( 使用 Adobe Audition 录制音频 | 在 Melodyne 中打开录制的音频 | Melodyne 对音频素材的操作 | 音频分析算法 )
【音频处理】Melodyne 简介 ( Melodyne 音频处理注意事项 | 在音乐宿主软件中加载 Melodyne 插件 )
【音频处理】Melodyne 简介 ( Melodyne 音频处理注意事项 | 在音乐宿主软件中加载 Melodyne 插件 )
501 0
【音频处理】Melodyne 简介 ( Melodyne 音频处理注意事项 | 在音乐宿主软件中加载 Melodyne 插件 )
|
Ubuntu
FFMPEG音频视频开发: 命令行方式给视频添加音频数据
FFMPEG音频视频开发: 命令行方式给视频添加音频数据
544 0