directX视频播放------手动连接

简介: <p><br></p><p><img src="http://img.blog.csdn.net/20141028095016390?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFvMDUxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"



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();  
}


相关文章
|
开发工具 C# C++
Windows平台RTMP|RTSP播放器实现画面全屏功能
我们在Windows平台实现RTSP或者RTMP播放的时候,有个功能是绕不开的,那就是播放窗口全屏。本文就以大牛直播SDK(官方)的Windows播放器为例,大概讲下大概实现:
282 0
|
开发工具 图形学 Android开发
Windows/Android/IOS平台如何在Unity3d播放RTSP/RTMP流
如果基于Unity3d完全重新开发一个播放器,代价大,周期长,不适合快速出产品,最好的方式就是集成现有Native平台上成熟稳定播放器.
171 1
|
数据采集 物联网 Linux
Unity3D下实现Linux平台RTMP推流(以采集Unity窗体和声音为例)
随着物联网等行业的崛起,越来越多的传统行业如虚拟仿真、航天工业、工业仿真、城市规划等,对Linux下的生态构建,有了更大的期望,Linux平台下,可选的直播推拉流解决方案相对Windows和移动端,非常少,基于Unity的Linux推送方案,更是几无参考。本文以Unity3d环境下Linux平台推送Unity窗体和Unity采集的音频,然后编码推送到RTMP服务器为例,大概说下实现过程。
220 0
|
Windows 内存技术
实战--虚拟机用ffmpeg采集音频设备,并用rtmp推流
实战--虚拟机用ffmpeg采集音频设备,并用rtmp推流
249 0
|
Web App开发 缓存 异构计算
猿大师播放器在Chrome网页播放多路H.265海康威视RTSP视频流页面卡顿CPU占用高怎么办?
试用猿大师播放器播放一路视频效果很不错,延迟可以控制在200毫秒左右,但是如果播放多路高清视频,CPU占用就会比较高,并且网页也会卡顿,该如何解决呢?
631 0
猿大师播放器在Chrome网页播放多路H.265海康威视RTSP视频流页面卡顿CPU占用高怎么办?
|
芯片
蓝牙芯片----BK3431开发笔记------注意事项(1)
蓝牙芯片----BK3431开发笔记------注意事项(1)
219 0
蓝牙芯片----BK3431开发笔记------注意事项(1)
|
物联网 芯片
蓝牙芯片----BK3431开发笔记------快速入门(2)
蓝牙芯片----BK3431开发笔记------快速入门(2)
710 0
蓝牙芯片----BK3431开发笔记------快速入门(2)
|
Linux Android开发 Windows
FFMPEG音视频开发: 完成摄像头、桌面本地录制与rtmp推流(windows)
FFMPEG音视频开发: 完成摄像头、桌面本地录制与rtmp推流(windows)
791 0
FFMPEG音视频开发: 完成摄像头、桌面本地录制与rtmp推流(windows)
|
芯片
蓝牙芯片----BK3431开发笔记------基本外部驱动应用(3)
蓝牙芯片----BK3431开发笔记------基本外部驱动应用(3)
266 0
|
Android开发 iOS开发
阿里云移动端播放器高级功能---截图和音频波形
如果用户对视频播放中的某一帧画面特别感兴趣,可以使用截图功能将这一帧视频保存起来。另外有一种场景想知道是否有声音,或者想感知声音的大小震动频率等,可以通过显示一个声音的波形来形象的表示。如下图所示:
8421 0

热门文章

最新文章