为什么用这样的方法保存出来的视频质量很差呢?界面花花的,郁闷啊,是不是我没有设置压缩
器的原因??我是用智能控制引擎的,主要代码如下:
//--------------------------------------------
// 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);