创建了IFileSourceFilter,可IFileSourceFilter好像不是从IBaseFilter继承来的,没有EnumPins,那应该怎么查找IFileSourceFilter上的pin啊?

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

HRESULT AddSourceByFilterCLSID(IGraphBuilder *pGraph,const GUID& clsid,	LPCWSTR wszName,LPCWSTR wszFileName)
{
		if  (!pGraph) return E_POINTER;
		IBaseFilter *pF = 0;
		HRESULT      hr = S_OK;
		hr = CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pF));
		if (SUCCEEDED(hr))
		{
			hr = pGraph->AddFilter(pF, wszName);
			if (SUCCEEDED(hr))
			{
				IFileSourceFilter *pSF = NULL;
				hr = pF->QueryInterface(IID_IFileSourceFilter, (void**)&pSF);
				if (SUCCEEDED(hr))
				{
					pSF->Load(wszFileName, NULL);
					pSF->Release();
				}
			}

			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)
						{
							hr = pGraph->Render(pPin);
							if (FAILED(hr))
							{
								break;
							}
						}
						pPin->Release();
					}
					pEnum->Release();
				}
			}

			pF->Release();
		}
		return hr;
} 

HRESULT RenderAVI(LPCTSTR szFilePath,IGraphBuilder * gb)
{
	LPCTSTR szExt = _tcsrchr(szFilePath,'.');//过滤avi文件
	if(!szExt)
	{
		return E_FAIL;
	}
	++szExt;
	if(_tcsicmp(szExt,_T("avi"))!=0) return E_INVALIDARG;
	USES_CONVERSION;
	const GUID CLSID_AviSource={0xCEA8DEFF,0x0AF7,0x4DB9,{0x9A,0x38,0xFB,0x3C,0x3A,0xEF,0xC0,0xDE}};
	CComPtr<IBaseFilter> spAviSource;
	HRESULT hr = AddSourceByFilterCLSID(gb,CLSID_AviSource,L"SOURCE FILTER",T2W(szFilePath));
	if(spAviSource==NULL) return hr;
/*	CComQIPtr<IFileSourceFilter> FileSource(spAviSource);
	hr = FileSource->Load(T2W(szFilePath),NULL);
	if(FAILED(hr)) return hr;
	CComPtr<IEnumPins> ep;
	hr = spAviSource->EnumPins(&ep);
	if(FAILED(hr)) return hr;
	CComPtr<IPin> pin;
	DWORD dwCount;
	int i = 0;
	for(;;)
	{
		dwCount = 0;
		hr = ep->Next(1,&pin,&dwCount);
		if(hr!=NOERROR)
		{
			if(i) hr = NOERROR;
			break;
		}
		hr = gb->Render(pin);
		if(hr==NOERROR) ++i;
		pin = NULL;
	}
	return hr;*/
	return NOERROR;
}

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);
	   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 = pigb->RenderFile(L"d:\\temp\\bmw.MPG", NULL);//
      hr = RenderAVI("F:\\FFOutput\\ff640480.avi",pigb);

      if (hr)
      {
		  MessageBox("ERR RENDERAVI!");
      }

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

查找IFileSourceFilter上的Pin的更多相关文章

  1. Unity3D开发之查找面板上某个脚本(包括Missing)

    原地址:http://blog.csdn.net/lihandsome/article/details/24265411 有时候我们需要知道某个脚本在场景上面哪里用到,或者那个脚本被删除了但又没有把相 ...

  2. Unity3D开发之查找面板上某个脚本(包含Missing)

    有时候我们须要知道某个脚本在场景上面哪里用到,或者那个脚本被删除了但又没有把相关游戏场景的关联东西删掉,那样我们就要一个脚本来查找一下了: PS:以下两个脚本都要放到assets/Editor以下哦. ...

  3. 用 TWebBrowser 查找网页上的按钮,编辑框,

    Form1.wb1.Navigate(Aurl); <table> <tr> <td style="text-align:right;">< ...

  4. 如何查找Mac上的USB存储设备使用痕迹

    最近刚好有个案子的证物主机是MBP, OS X版本为El Capitan,案况与营业秘密外泄有关,当中要找有关USB存储设备的使用痕迹. 要提醒大家的是,不同版本的OS X,各种迹证的存放文件名称及路 ...

  5. sql server 查找字段上的约束

    1. 当字段没有默认值或者约束的时候可以使用: alter table [table_name] drop column [column_name] 来删除. 当有默认值的时候应该先删除默认值,然后再 ...

  6. tomcat服务器用Servlet类查找磁盘文件上的Json信息,如果匹配则在浏览器上显示出该条内容的全部信息

    package com.swift; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOE ...

  7. 如何查找Windows上安装的DB2的端口号Port

    1.db2com打开控制台 2.db2 get dbm cfg 可以通过db2 get dbm cfg,查询数据库管理器配置参数,就可以查到端口号或端口名. 示例: $ db2 get dbm cfg ...

  8. [原创]C#应用WindowsApi实现查找\枚举(FindWindow、EnumChildWindows)窗体控件,并发送消息。

    首先介绍基本WindowsApi: public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 函 ...

  9. 5、利用控件TVCLZip和TIdFTP压缩文件并上传到FTP的线程单元pas 改进版

    用到临界区 保护写日志的函数: 递归函数 删除目录下的所有文件: 循环创建或判断FTP的目录: 可改进的地方:循环压缩深层次目录的所以文件: 实现断点续传,或断点下载: {************** ...

随机推荐

  1. NIO基础篇(二)

    Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 传统的 ...

  2. BZOJ 1982: [Spoj 2021]Moving Pebbles [博弈论 对称]

    给你N堆Stone,两个人玩游戏. 每次任选一堆,首先拿掉至少一个石头,然后移动任意个石子到任意堆中. 谁不能移动了,谁就输了... 以前在poj做过已经忘记了... 构造对称,选最多的一堆往其他堆分 ...

  3. python学习1:程序元素和基本使用方法(跟随mooc学习)

    程序元素: 注释,缩进,变量,常量,表达式 输入,输出,分支,循环 示例程序,温度转换程序: #TempConvert.pyval=input("请输入带温度表示符号发温度值(例如:32C) ...

  4. 【翻译】我如何使用CSS来制作bitsofcode Logo动画

    翻译文章,翻译不好,还望大家指出 原文地址:How I Animated the bitsofcode Logo with CSS 我是css动画的新手,这样说是因为我只在有限的案例中使用过他们,而且 ...

  5. LeetCode - 620. Not Boring Movies

    X city opened a new cinema, many people would like to go to this cinema. The cinema also gives out a ...

  6. yii2 源码分析Action类分析 (六)

    Action类是控制器的基类, <?php namespace yii\base; use Yii; /** * Action是所有控制器动作类的基类,它继承组件类 * * 动作提供了重用动作方 ...

  7. JSP的几种跳转方式的异同

    1 <jsp:foward page="url" /> 服务端跳转,立即跳转,后续语句不会执行: 2 <% response.sendRedirect(" ...

  8. Vue.js依赖收集

    写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/an ...

  9. AVFoundation 框架初探究(四)

    叨叨两句 动手写这篇总结时候也是二月底过完年回来上班了,又开始新的一年了,今年会是什么样子?这问题可能得年底再回答自己了.在家窝了那么久,上班还是的接着看我们要看的东西,毕竟我们要做的事还真的太多的. ...

  10. Node.js入门(含NVM、NPM、NVM的安装)

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. Node.js的介绍 引擎 引擎的特性: JS的内核即引擎.因为引擎有以 ...