- void CXunLeiPlayDlg::OnCapstart()
- {
- CString str;
- CFileDialog FileDlg(FALSE,_T("AVI"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("视频文件|*.avi|"),this);
- if (FileDlg.DoModal()==IDOK)
- {
- str = FileDlg.GetPathName();
- }
-
- if (str.IsEmpty())
- {
- MessageBox(_T("请选择或输入文件"));
- return;
- }
-
- ICaptureGraphBuilder2 * pBuilder = NULL;
- pGraph = NULL;
-
- pMediaControl = NULL;
- IBaseFilter *pMux =NULL;
- IBaseFilter *pWriter=NULL;
- IBaseFilter *pCompress=NULL;
- IFileSinkFilter2 *pSink;
-
-
- ICreateDevEnum *pDevEnum = NULL;
- CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
- IID_ICreateDevEnum, (void **)&pDevEnum);
- IEnumMoniker *pClassEnum = NULL;
- pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
- ULONG cFetched;
- if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
- {
- pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
- pMoniker->Release();
- }
- pClassEnum->Release();
-
- pDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pClassEnum, 0);
- while (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
- {
- IPropertyBag* pProp= NULL;
- pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)&pProp);
- VARIANT varName;
- varName.vt = VT_BSTR;
- pProp->Read(L"FriendlyName", &varName,0);
- CString str = varName.bstrVal;
-
- if (str.Find(_T("Microsoft Video 1"),0)!= -1)
- {
- pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCompress);
- pMoniker->Release();
- break;
- }
- VariantClear(&varName);
- }
- pClassEnum->Release();
-
- if (pCompress==NULL)
- {
- MessageBox(_T("没有发现Microsoft Video 1压缩器!"),_T("提示"),MB_ICONASTERISK);
- return;
- }
-
- CoCreateInstance(CLSID_CaptureGraphBuilder2,0,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pBuilder);
- CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
- IID_IGraphBuilder, (void **)&pGraph);
-
- pBuilder->SetFiltergraph(pGraph);
- pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);
-
-
- pGraph->AddFilter(pSrc,L"avi");
- pGraph->AddFilter(pCompress,L"com");
- CoCreateInstance(CLSID_AviDest,NULL, CLSCTX_ALL,
- IID_IBaseFilter,(void**)&pMux);
- pGraph->AddFilter(pMux,L"Mux");
- CoCreateInstance(CLSID_FileWriter, NULL, CLSCTX_ALL,
- IID_IBaseFilter, (void **)&pWriter);
- pGraph->AddFilter(pWriter,L"Writer");
- pWriter->QueryInterface(IID_IFileSinkFilter2,(void**)&pSink);
- pSink->SetFileName(str.AllocSysString(),NULL);
-
-
- IAMVideoCompression * pAMCompress ;
- IPin * pComOut,*pComIn ;
- pComIn = FindPin(pCompress,PINDIR_INPUT);
- pComOut = FindPin(pCompress,PINDIR_OUTPUT);
- pComOut->QueryInterface(IID_IAMVideoCompression,(void**)&pAMCompress);
-
- HRESULT hret;
- hret = pAMCompress->put_KeyFrameRate(8);
-
- IPin* pOutpin = FindPin(pSrc,PINDIR_OUTPUT);
- IPin* pInpin,*pOut;
-
- pInpin = FindPin(pMux,PINDIR_INPUT);
-
- pOut= FindPin(pMux,PINDIR_OUTPUT);
- IPin* pInpin1= FindPin(pWriter,PINDIR_INPUT);
-
-
- HRESULT result ;
- result = pGraph->ConnectDirect(pOutpin,pComIn,NULL);
- result = pGraph->ConnectDirect((IPin *)pComOut,pInpin,NULL);
- result = pGraph->ConnectDirect(pOut,pInpin1,NULL);
-
- pMediaControl->Run();
- pAMCompress->Release();
- m_IsRecorded = TRUE;
- }
|