DirectShow 视频录制保存为avi文件

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); //pSrc的输出引脚
	IPin* pInpin,*pOut;	                         //pMux的输入\输出引脚

	pInpin = FindPin(pMux,PINDIR_INPUT);

	pOut= FindPin(pMux,PINDIR_OUTPUT);
	IPin* pInpin1= FindPin(pWriter,PINDIR_INPUT);//pWriter的输入引脚	

	//连接引脚
	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;
}


你可能感兴趣的:(DirectShow 视频录制保存为avi文件)