恳求各位大侠帮忙,本人初次接触到DirectShow就遇到问题,折腾了两天也没有弄好,求助各位好心人:
问题是这样的:我想把硬盘上现有的视频文件比如avi.mpg的文件重新保存成wmv格式的,参考了下书上和网上的例子写下了如下的代码,发现程序没有反应,恳请帮忙。。不胜感激。
CString strName;
GetDlgItem(IDC_EDIT1)->GetWindowText(strName);
pBuilder=NULL;
pGraph=NULL;
pMC=NULL;
HRESULT hr=NOERROR;
CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,
CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2,
(void**)&pBuilder);
CoCreateInstance(CLSID_FilterGraph, NULL, 
CLSCTX_INPROC_SERVER, 
                    IID_IGraphBuilder, 
(void **)&pGraph);
pBuilder->SetFiltergraph(pGraph);
IBaseFilter *pSrc,*pASFWriter = 0; CoCreateInstance(CLSID_AsyncReader, NULL, CLSCTX_ALL, 
                     IID_IBaseFilter, (void **)&pSrc);
CoCreateInstance(CLSID_WMAsfWriter, NULL, CLSCTX_ALL, 
                     IID_IBaseFilter, (void **)&pASFWriter);
pGraph->AddFilter(pSrc,L"FileSource(Async.)");
pGraph->AddFilter(pASFWriter,L"WM ASF Writer");

pASFWriter->QueryInterface(IID_IFileSinkFilter2,(void**)&pSink);
pSink->SetFileName(strName.AllocSysString(),NULL);    IPin* pOutpin = FindPin(pSrc,PINDIR_OUTPUT);
IPin* pInpin= FindPin(pASFWriter,PINDIR_INPUT);
//连接滤波器的引脚
pGraph->ConnectDirect(pOutpin,pInpin,NULL);
pBuilder->RenderStream(
                              &PIN_CATEGORY_CAPTURE, // Capture pin.
                                 &MEDIATYPE_Video, // Video. Use MEDIATYPE_Audio for audio.
                               pSrc, // Pointer to the capture filter. 
                                    0, 
                                  pASFWriter); // Pointer to the sink filter (ASF Writer).

解决方案 »

  1.   

    大侠们,帮帮忙吧,我把功能缩小了,只是把avi的转换成wmv的。代码如下,但是运行没有结果,调试时发现FinePin函数读取引脚时,读输入引脚可以,输出引脚不行,包括源filter,输出引脚也有问题,高人请帮忙看下吧。:
    void CAvitowmvDlg::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知处理程序代码
    CString strFilter=_T("AVI File (*.avi)|*.avi|");
            strFilter+="All File(*.*|*.*|";
    CFileDialog dlg(TRUE,NULL,NULL,
                              OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
      strFilter,this);
    if(dlg.DoModal()==IDOK)
    {
    CString strName=dlg.GetPathName();
    strName+=".wmv";
    this->m_edit=strName;
    UpdateData(FALSE);
     Convert2Wmv(strName);
    }
       
    }
     void CAvitowmvDlg::Convert2Wmv(CString fileName)
     {
     pBuilder=NULL;
    pGraph=NULL;
    pMediaControl=NULL;
    HRESULT hr=NOERROR; CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,
    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->RenderFile (fileName,NULL);  CoCreateInstance(CLSID_AsyncReader, NULL, CLSCTX_ALL, 
                         IID_IBaseFilter, (void **)&pSrc);
     pGraph->AddFilter(pSrc,L"FileSource(Async.)");

     CoCreateInstance(CLSID_AviSplitter, NULL, CLSCTX_ALL, 
                         IID_IBaseFilter, (void **)&pAviSplitter);
     pGraph->AddFilter(pAviSplitter,L"Avi Splitter");  CoCreateInstance(CLSID_WMAsfWriter, NULL, CLSCTX_ALL, 
                         IID_IBaseFilter, (void **)&pASFWriter);
     pGraph->AddFilter(pASFWriter,L"WM ASF Writer");

      pASFWriter->QueryInterface(IID_IFileSinkFilter, (void**) &pSink);
      hr=pSink->SetFileName(fileName.AllocSysString(), NULL);
      pSink->Release();   IPin* pOutpin1 = FindPin(pSrc,PINDIR_OUTPUT);
      IPin* pInpin1=FindPin(pAviSplitter,PINDIR_INPUT);
      pGraph->ConnectDirect(pOutpin1,pInpin1,NULL);
     
      IPin  *pVideoOut   =FindPin (pAviSplitter,PINDIR_OUTPUT);
      IPin  *pAideoOut   =FindPin (pAviSplitter,PINDIR_OUTPUT);
          
       IPin* pVideoInpin= FindPin(pASFWriter,PINDIR_INPUT);
       IPin* pAideoInpin= FindPin(pASFWriter,PINDIR_INPUT);   pGraph->ConnectDirect(pVideoOut,pVideoInpin,NULL);
      pGraph->ConnectDirect(pAideoOut,pAideoInpin,NULL);
     pMediaControl->Run ();
        
     }
     IPin  * CAvitowmvDlg::FindPin(IBaseFilter *pFilter, PIN_DIRECTION dir)
      {   
             IEnumPins* pEnumPins;
    IPin* pOutpin;
    PIN_DIRECTION pDir;
    pFilter->EnumPins(&pEnumPins); while (pEnumPins->Next(1,&pOutpin,NULL)==S_OK)
    {
    pOutpin->QueryDirection(&pDir);
    if (pDir==dir)
    {
    return pOutpin;
    }
    }
    return 0; 
     }