天天看点

懂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的帮忙啊