Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2716683
  • 博文数量: 416
  • 博客积分: 10220
  • 博客等级: 上将
  • 技术积分: 4193
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-15 09:47
文章分类

全部博文(416)

文章存档

2022年(1)

2021年(1)

2020年(1)

2019年(5)

2018年(7)

2017年(6)

2016年(7)

2015年(11)

2014年(1)

2012年(5)

2011年(7)

2010年(35)

2009年(64)

2008年(48)

2007年(177)

2006年(40)

我的朋友

分类: WINDOWS

2007-01-26 17:08:25

看了DXSDK\Samples\C++\DirectShow\Editing\GrabBitmaps\的运行过程
把程序的枝叶去掉,看看程序主要是如何一下运行顺序,这样有利于明白其中的运行顺序,也好与看过它的朋友有个交流,其中的注释可能用得不对或不恰当,请指教或留言


声明对象:   
    CComPtr< ISampleGrabber > pGrabber;
    CComPtr< IBaseFilter >    pSource;
    CComPtr< IGraphBuilder >  pGraph;
    CComPtr< IVideoWindow >   pVideoWindow;
创建对象:   
pGrabber.CoCreateInstance( CLSID_SampleGrabber );
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabberBase( pGrabber );
pSource.CoCreateInstance( CLSID_AsyncReader );
pGraph.CoCreateInstance( CLSID_FilterGraph );
加入过滤器:
    hr = pGraph->AddFilter( pSource, L"Source" );
    hr = pGraph->AddFilter( pGrabberBase, L"Grabber" );
加载数据源:
CComQIPtr< IFileSourceFilter, &IID_IFileSourceFilter > pLoad( pSource );
hr = pLoad->Load( T2W( szFile ), NULL );
设置媒体类型:
  CMediaType GrabType;
    GrabType.SetType( &MEDIATYPE_Video );
    GrabType.SetSubtype( &MEDIASUBTYPE_RGB24 );
    hr = pGrabber->SetMediaType( &GrabType );
得到输出输入Pin
    CComPtr< IPin > pSourcePin;
    CComPtr< IPin > pGrabPin;
    pSourcePin = GetOutPin( pSource, 0 );
    pGrabPin   = GetInPin( pGrabberBase, 0 );
连结输出输入Pin:
    hr = pGraph->Connect( pSourcePin, pGrabPin );
CSampleGrabberCB CB;
得到源音频的长宽
  AM_MEDIA_TYPE mt;
    hr = pGrabber->GetConnectedMediaType( &mt );
    VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
    CB.Width  = vih->bmiHeader.biWidth;
    CB.Height = vih->bmiHeader.biHeight;
    FreeMediaType( mt );
   
得到输出Pin,以video renderer之用   
    CComPtr pGrabOutPin = GetOutPin( pGrabberBase, 0 );
    hr = pGraph->Render( pGrabOutPin );
   
抓取设置 
hr = pGrabber->SetBufferSamples( FALSE );
hr = pGrabber->SetOneShot( TRUE );
hr = pGrabber->SetCallback( &CB, 1 );
CComQIPtr< IMediaSeeking, &IID_IMediaSeeking > pSeeking( pGraph );
关于窗口:
CComQIPtr< IVideoWindow, &IID_IVideoWindow > pWindow = pGraph;
if (pWindow)
{
    hr = pWindow->put_AutoShow(OAFALSE);
}
输出图片:
for( int i = 0 ; i < NUM_FRAMES_TO_GRAB ; i++ )
{
    REFERENCE_TIME Start = i * UNITS;
    输出位置
    hr = pSeeking->SetPositions( &Start, AM_SEEKING_AbsolutePositioning,
                                 NULL, AM_SEEKING_NoPositioning );
    CComQIPtr< IMediaControl, &IID_IMediaControl > pControl( pGraph );
    运行
    hr = pControl->Run( );
    消息处理
    CComQIPtr< IMediaEvent, &IID_IMediaEvent > pEvent( pGraph );
    long EvCode = 0;
    hr = pEvent->WaitForCompletion( INFINITE, &EvCode );
}
阅读(2344) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~