zoukankan      html  css  js  c++  java
  • directX视频播放------手动连接 分类: DirectX 2014-10-28 09:50 515人阅读 评论(0) 收藏



    IGraphBuilder *pigb  = NULL;
    IMediaControl *pimc  = NULL;
    IMediaEventEx *pimex = NULL;
    IVideoWindow  *pivw  = NULL;
    IMediaSeeking  *pims  = NULL;
    ICaptureGraphBuilder2 * g_pCaptureBuilder = NULL;

    IBaseFilter *pF = 0; 
    void CTestFilterDlg::OnButton4() 
    {
    	// TODO: Add your control notification handler code here
    	CoInitialize(NULL);
        HRESULT	hr = CoCreateInstance(CLSID_FilterGraph,
    		NULL,
    		CLSCTX_INPROC_SERVER,
    		IID_IGraphBuilder,
    		(void **)&pigb);
        hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
                               IID_ICaptureGraphBuilder2, (void **) &g_pCaptureBuilder);
    	   pigb->QueryInterface(IID_IMediaControl, (void **)&pimc);
    	   pigb->QueryInterface(IID_IMediaEventEx, (void **)&pimex);
           pigb->QueryInterface(IID_IMediaSeeking, (void **)&pims);
    	   pigb->QueryInterface(IID_IVideoWindow, (void **)&pivw);
    	  hr = g_pCaptureBuilder->SetFiltergraph(pigb);
     // avi-source ////////////////////////////////////////////////////////////
    	  const GUID CLSID_AviSource={0xCEA8DEFF,0x0AF7,0x4DB9,{0x9A,0x38,0xFB,0x3C,0x3A,0xEF,0xC0,0xDE}};
    	  hr = CoCreateInstance(CLSID_AviSource, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pF)); 
    	  hr = pigb->AddFilter(pF,L"SOURCE FILTER");
    	  IFileSourceFilter *pSF = NULL;
    	  hr = pF->QueryInterface(IID_IFileSourceFilter, (void**)&pSF);
    	  if (SUCCEEDED(hr))
    	  {
    		  pSF->Load(L"F:\FFOutput\ff640480.avi", NULL);
    		  pSF->Release();
    	  }
    	  IPin *pOut_Source = 0;
    	   IPin      *pPin;
    	  if(SUCCEEDED(hr))
    	  {
    		  IEnumPins *pEnum;
    	//	  IPin      *pPin;
    		  hr = pF->EnumPins(&pEnum);
    		  if (SUCCEEDED(hr))
    		  {
    			  /*
    			  while(pEnum->Next(1, &pPin, 0) == S_OK)
    			  {
    				  PIN_DIRECTION pinDirThis;
    				  pPin->QueryDirection(&pinDirThis);
    				  if (PINDIR_OUTPUT == pinDirThis)
    				  {
    					  break;
    				  }
    			  }*/
    			  hr = g_pCaptureBuilder->FindPin(pF,PINDIR_OUTPUT,NULL,NULL,FALSE,0,&pPin);
    			  pEnum->Release();
    		  }
    			
    	  }
         pOut_Source= pPin;
          if (hr)
          {
    		  MessageBox("ERR RENDERAVI!");
          }
    // ffshow-decoder  /////////////////////////////////////////////////
    	  IBaseFilter *paviDecoder;//---871E-AB91661A4EF7
    	  const GUID CLSID_Decoder={0x04FE9017,0xF873,0x410E,{0x87,0x1e,0xaB,0x91,0x66,0x1a,0x4e,0xf7}};
    	  hr = CoCreateInstance(CLSID_Decoder,NULL,CLSCTX_ALL,IID_IBaseFilter,(void **)&paviDecoder);
          hr = pigb->AddFilter(paviDecoder,L"ffdshow Video Decoder ");
    
    	  IPin *pIn_aviDecoder = 0;
    	  IPin *pOut_aviDecoder = 0;
    	  hr = g_pCaptureBuilder->FindPin(paviDecoder,PINDIR_INPUT,NULL,NULL,FALSE,0,&pIn_aviDecoder);
    	  hr = g_pCaptureBuilder->FindPin(paviDecoder,PINDIR_OUTPUT,NULL,NULL,FALSE,0,&pOut_aviDecoder);
    // Render filter ////////////////////////////////////////
    	  IBaseFilter *pRenderFilter;
          hr = CoCreateInstance(CLSID_VideoRenderer,NULL,CLSCTX_ALL,IID_IBaseFilter,(void **)&pRenderFilter);
    	  hr = pigb->AddFilter(pRenderFilter,L"ffdshow Video Render ");
    	  IPin *pIn_Render = 0;
    	  hr = g_pCaptureBuilder->FindPin(pRenderFilter,PINDIR_INPUT,NULL,NULL,FALSE,0,&pIn_Render);
    ///// 特效filter ///////////////////////////////////////////////
    	  IBaseFilter *peffect;//---871E-AB91661A4EF7
    	  const GUID CLSID_EFFECT={0x8b498501, 0x1218, 0x11cf,{ 0xad, 0xc4, 0x0, 0xa0, 0xd1, 0x0, 0x4, 0x1b}};
    	  hr = CoCreateInstance(CLSID_EFFECT,NULL,CLSCTX_ALL,IID_IBaseFilter,(void **)&peffect);
          hr = pigb->AddFilter(peffect,L"Image effect ");
    
    	  IPin *pIn_peffect = 0;
    	  IPin *pOut_peffect = 0;
    	  hr = g_pCaptureBuilder->FindPin(peffect,PINDIR_INPUT,NULL,NULL,FALSE,0,&pIn_peffect);
    	  hr = g_pCaptureBuilder->FindPin(peffect,PINDIR_OUTPUT,NULL,NULL,FALSE,0,&pOut_peffect);
    	  peffect->Release();
     /// Connect 连接 pin/////////////////////////
    	  hr = pigb->Connect(pOut_Source, pIn_aviDecoder);
    	  if(FAILED(hr))
    	  {
    	      MessageBox("err17");
    	  }
    	  hr = pigb->Connect(pOut_aviDecoder, pIn_peffect);
    	  if(FAILED(hr))
    	  {
    		  MessageBox("err18");
    	  }
    	  hr = pigb->Connect(pOut_peffect, pIn_Render);
    	 if(FAILED(hr))
    	 {
    		MessageBox("err19");
    	 }
    ///////显示//////////////////////
    	   HWND m_hwndScreen = m_Screen2.GetSafeHwnd();
    	   
    	   RECT rc;
    
    	   hr = pivw->put_Owner((OAHWND)m_hwndScreen);
    	   hr = pivw->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
    	   m_Screen2.GetClientRect(&rc);
    	   hr = pivw->SetWindowPosition(0, 0, (rc.right), (rc.bottom));
    	   hr = pivw->put_Visible(OATRUE);//*/
    	   hr = pimc->Run();  
    }


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    window.location.href问题,点击,跳转到首页
    JS indexOf() lastIndexOf()与substring()截取字符串的区别
    原来的方法增加参数时,必须为新增的参数加个默认值
    Chrome不支持本地Ajax请求解决?
    Smarty中{literal}的使用详解
    windows不能在本地计算机启动apache
    Apache虚拟主机配置
    wamp环境网站根目录更改
    Java 读书笔记 (十三) for each 循环
    Java 读书笔记 (十二) Java Character 类
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706488.html
Copyright © 2011-2022 走看看