分享

DirectShow 视频录制保存为avi文件

 我喝多了 2014-10-30
  1. void CXunLeiPlayDlg::OnCapstart()//开始录制  
  2. {  
  3.     CString str;  
  4.     CFileDialog FileDlg(FALSE,_T("AVI"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("视频文件|*.avi|"),this);  
  5.     if (FileDlg.DoModal()==IDOK)  
  6.     {  
  7.         str = FileDlg.GetPathName();  
  8.     }     
  9.   
  10.     if (str.IsEmpty())  
  11.     {  
  12.         MessageBox(_T("请选择或输入文件"));  
  13.         return;  
  14.     }  
  15.   
  16.     ICaptureGraphBuilder2 * pBuilder = NULL;  
  17.     pGraph = NULL;  
  18.   
  19.     pMediaControl = NULL;  
  20.     IBaseFilter *pMux =NULL;  
  21.     IBaseFilter *pWriter=NULL;  
  22.     IBaseFilter *pCompress=NULL;  
  23.     IFileSinkFilter2 *pSink;  
  24.   
  25.     //枚举视频设备  
  26.     ICreateDevEnum *pDevEnum = NULL;  
  27.     CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,   
  28.         IID_ICreateDevEnum, (void **)&pDevEnum);  
  29.     IEnumMoniker *pClassEnum = NULL;  
  30.     pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);  
  31.     ULONG cFetched;  
  32.     if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)       
  33.     {  
  34.         pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);  
  35.         pMoniker->Release();   
  36.     }  
  37.     pClassEnum->Release();  
  38.     //列举视频压缩设备  
  39.     pDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pClassEnum, 0);  
  40.     while (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)       
  41.     {  
  42.         IPropertyBag* pProp= NULL;  
  43.         pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)&pProp);  
  44.         VARIANT varName;  
  45.         varName.vt = VT_BSTR;  
  46.         pProp->Read(L"FriendlyName", &varName,0);  
  47.         CString str = varName.bstrVal;  
  48.   
  49.         if (str.Find(_T("Microsoft Video 1"),0)!= -1)  
  50.         {  
  51.             pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCompress);  
  52.             pMoniker->Release();   
  53.             break;  
  54.         }  
  55.         VariantClear(&varName);  
  56.     }  
  57.     pClassEnum->Release();  
  58.   
  59.     if (pCompress==NULL)  
  60.     {  
  61.         MessageBox(_T("没有发现Microsoft Video 1压缩器!"),_T("提示"),MB_ICONASTERISK);  
  62.         return;  
  63.     }  
  64.   
  65.     CoCreateInstance(CLSID_CaptureGraphBuilder2,0,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pBuilder);  
  66.     CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,   
  67.         IID_IGraphBuilder, (void **)&pGraph);  
  68.   
  69.     pBuilder->SetFiltergraph(pGraph);  
  70.     pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);  
  71.   
  72.   
  73.     pGraph->AddFilter(pSrc,L"avi");  
  74.     pGraph->AddFilter(pCompress,L"com");  
  75.     CoCreateInstance(CLSID_AviDest,NULL, CLSCTX_ALL,   
  76.         IID_IBaseFilter,(void**)&pMux);  
  77.     pGraph->AddFilter(pMux,L"Mux");  
  78.     CoCreateInstance(CLSID_FileWriter, NULL, CLSCTX_ALL,   
  79.         IID_IBaseFilter, (void **)&pWriter);  
  80.     pGraph->AddFilter(pWriter,L"Writer");  
  81.     pWriter->QueryInterface(IID_IFileSinkFilter2,(void**)&pSink);  
  82.     pSink->SetFileName(str.AllocSysString(),NULL);  
  83.   
  84.     //压缩器输入\输出引脚  
  85.     IAMVideoCompression * pAMCompress ;  
  86.     IPin * pComOut,*pComIn ;  
  87.     pComIn  = FindPin(pCompress,PINDIR_INPUT);  
  88.     pComOut = FindPin(pCompress,PINDIR_OUTPUT);  
  89.     pComOut->QueryInterface(IID_IAMVideoCompression,(void**)&pAMCompress);  
  90.   
  91.     HRESULT hret;  
  92.     hret = pAMCompress->put_KeyFrameRate(8);  
  93.   
  94.     IPin* pOutpin = FindPin(pSrc,PINDIR_OUTPUT); //pSrc的输出引脚  
  95.     IPin* pInpin,*pOut;                          //pMux的输入\输出引脚  
  96.   
  97.     pInpin = FindPin(pMux,PINDIR_INPUT);  
  98.   
  99.     pOut= FindPin(pMux,PINDIR_OUTPUT);  
  100.     IPin* pInpin1= FindPin(pWriter,PINDIR_INPUT);//pWriter的输入引脚   
  101.   
  102.     //连接引脚  
  103.     HRESULT result ;  
  104.     result = pGraph->ConnectDirect(pOutpin,pComIn,NULL);  
  105.     result = pGraph->ConnectDirect((IPin *)pComOut,pInpin,NULL);  
  106.     result = pGraph->ConnectDirect(pOut,pInpin1,NULL);  
  107.   
  108.     pMediaControl->Run();  
  109.     pAMCompress->Release();  
  110.     m_IsRecorded = TRUE;  
  111. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多