博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

zz

  weiliming.cublog.cn

关于作者
姓名:
职业:
年龄:
位置:
个性介绍:
|| << >> ||
我的分类


GrabBitmaps抓图过程 zz
看了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 <IPin> 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 );
}

发表于: 2008-03-08,修改于: 2008-07-28 21:57,已浏览121次,有评论0条 推荐 投诉


网友评论
 发表评论