天天看點

懂DirectShow的幫忙啊

為什麼用這樣的方法儲存出來的視訊品質很差呢?界面花花的,郁悶啊,是不是我沒有設定壓縮

器的原因??我是用智能控制引擎的,主要代碼如下:

 //--------------------------------------------

    // create the render engine

    //--------------------------------------------

    hr = CoCreateInstance(

                         CLSID_SmartRenderEngine,

                         NULL,

                         CLSCTX_INPROC_SERVER,

                         IID_IRenderEngine,

                         (void**) &pRenderEngine );   //建立控制引擎

    ASSERT( !FAILED( hr ) );

    // tell the render engine about the timeline it should look at

    //

    hr = pRenderEngine->SetTimelineObject( pTimeline ); //設定時間線對象給控制引擎

    ASSERT( !FAILED( hr ) );

    //--------------------------------------------

    // connect up the front end, then the back end

    //--------------------------------------------

    hr = pRenderEngine->ConnectFrontEnd( );  //完成前端鍊路的建構

    //hr |= pRenderEngine->RenderOutputPins( );//将前端建構完成的輸出PIN分别連接配接到RENDERER FILTER上

    ASSERT( !FAILED( hr ) );

    //--------------------------------------------

    // get a bunch of pointers, then run the graph

    //--------------------------------------------

    hr = pRenderEngine->GetFilterGraph( &pGraph );  //得到控制引擎建立的鍊路指針

    hr |= pGraph->QueryInterface( IID_IMediaEvent, (void**) &pEvent );   //擷取事件接口

    hr |= pGraph->QueryInterface( IID_IMediaControl, (void**) &pControl );  //擷取控制接口

    hr |= pGraph->QueryInterface( IID_IMediaSeeking, (void**) &pSeeking );  //擷取随機定位接口

    hr |= pGraph->QueryInterface( IID_IVideoWindow, (void**) &pVidWindow );  //擷取視訊視窗接口

    ASSERT( !FAILED( hr ) );

 hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,

                          IID_ICaptureGraphBuilder2, (void **)&pBuilder2);  //建立輔助鍊路獲得ICaptureGraphBuilder2接口

 pBuilder2->SetFiltergraph(pGraph);  //設定鍊路對象

 IBaseFilter * pMux;

 CComBSTR  str;

 str.Append(m_Fliesavepath);  //擷取儲存路徑

 pBuilder2->SetOutputFileName(&MEDIASUBTYPE_Avi,str,&pMux,NULL);  //設定寫檔案

 //pMux->Release();

 //CComPtr< ISmartRenderEngine,&IID_ISmartRenderEngine >  pSmartRenderEngine(pVideoGroupObj);

    //IBaseFilter *pCompressor;

 long numgroup;

 pTimeline->GetGroupCount(&numgroup);  //擷取時間線組的個數

 for(long i=0;i<numgroup;i++)

 {

     IPin * pin;

  if(pRenderEngine->GetGroupOutputPin(i,&pin)==S_OK)  //擷取每個組的輸出PIN

  {

       pBuilder2->RenderStream(NULL,&MEDIATYPE_Video,pin,NULL,pMux);  //pBuilder2幫助建立後續鍊路

    pin->Release();

  }

 }

 hr = pControl->Run( );  //運作鍊路

    ASSERT( !FAILED( hr ) );

    //--------------------------------------------

    // wait for it

    //--------------------------------------------

    long EventCode = 0;

    hr = pEvent->WaitForCompletion( -1, &EventCode ); //等待鍊路給以所有有效資料,鍊路必須運作,否則調用該方法失敗

    ASSERT( !FAILED( hr ) );

 MessageBox("分割完成!!","提示",MB_OK);

懂DirectShow的幫忙啊

繼續閱讀