编写C++程序使DirectShow进行视频捕捉

2020-01-06 14:51:47于海丽


IConfigAsfWriter *pConfig = 0; 
hr = pASFWriter->QueryInterface(IID_IConfigAsfWriter, (void**)&pConfig); 
if(SUCCEEDED(hr)) 
{ 
  //Configure the ASF Writer filter 
  pConfig->Release(); 
} 
然后调用ICaptureGraphBuilder2::RenderStream将capture Filter 和 ASF writer连接起来:

hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,     //Capture pin 
             &MEDIATYPE_Video,       //Video. Use MEDIATYPE_Audio for audio 
             pCap,     //Pointer to the capture filter 
             0,  
             pASFWriter);   //Pointer to the sink filter(ASF Filter) 

 
3保存成自定义的文件格式
如果你想将文件保存成自己的格式,你必须有自己的 file writer。看下面的代码:


IBaseFilter *pMux = 0; 
IFileSinkFilter *pSink = 0; 
hr = pBuild->SetOutputFileName(&CLSID_MyCustomMuxFilter,   //开发自己的Filter 
                L"C:VidCap.avi", &pMux, &pSink); 
 

4如何将视频流保存进多个文件
当你将视频流保存进一个文件后,如果你想开始保存第二个文件,这时,你应该首先将graph停止,然后通过IFileSinkFilter::SetFileName改变 File Writer 的文件名称。注意,IFileSinkFilter指针你可以在SetOutputFileName时通过第四个参数返回的。
看看保存多个文件的代码:


IBaseFilter *pMux = 0; 
IFileSinkFilter *pSink = 0; 
hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi,  
                L"C:YourFileName.avi", &pMux, &pSink); 
if(SUCCEEDED(hr)) 
{ 
  hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, 
                        pCap, NULL, pMux); 
  if(SUCCEEDED(hr)) 
  { 
    pControl->Run(); 
    pControl->Stop(); 
    //Change the file name and run the graph again 
    pSink->SetFileName(L"YourFileName02.avi", 0); 
    pControl->Run(); 
  } 
 
  pMux->Release(); 
  pSink->Release(); 
}