為什麼用這樣的方法儲存出來的視訊品質很差呢?界面花花的,郁悶啊,是不是我沒有設定壓縮
器的原因??我是用智能控制引擎的,主要代碼如下:
//--------------------------------------------
// 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);