DirectShow 常用函数总结
本文准备总结一些 Direct Show 常用的API接口函数,方便以后查询回忆。如果这里没有你想了解的函数,你可以自行搜索MSDN + 函数名
去 MSDN 查找你想要了解的函数,也可以查看百度百科相关。 (持续更新中)
CoInitialize
在当前线程上初始化 COM 库。
Syntax
HRESULT CoInitialize(LPVOID pvReserved);
Parameters
pvReserved
:此参数是保留参数,必须为 NULL。
返回值
返回一个 HRESULT 值。可能的值包括:
- S_OK:COM 库在此线程上成功初始化。
- S_FALSE:COM 库已经在此线程上初始化过了。
备注
新应用程序应调用 CoInitializeEx 而不是 CoInitialize。CoInitializeEx 提供相同功能的同时还提供了参数明确指定线程的并发模型。CoInitialize 调用 CoInitializeEx 并将并发模型指定为单线程单元。
参考自:MSDN CoInitialize function
CoUninitialize
关闭当前线程上的 COM 库,卸载该线程加载的所有 DLL,释放该线程维护的所有其他资源,并强制关闭该线程上的所有 RPC 连接。
Syntax
void CoUninitialize();
Parameters
此函数没有参数。
返回值
此函数不返回值。
备注
线程每次成功调用 CoInitialize 或 CoInitializeEx 函数后,都必须调用相对应的 CoUninitialize 函数将 COM 库再关闭。
参考:MSDN CoUninitialize function
CoCreateInstance
用指定的类标识符创建一个未初始化的 COM 对象。
Syntax
HRESULT CoCreateInstance(
REFCLSID rclsid,
LPUNKNOWN pUnkOuter,
DWORD dwClsContext,
REFIID riid,
LPVOID *ppv
);
Parameters
rclsid
:创建的 COM 对象的类标识符(CLSID)。pUnkOuter
:指向接口 IUnknown 的指针,大多数情况下都设置为 NULL。dwClsContext
:运行新创建对象的代码的上下文。该值取自枚举 CLSCTX。riid
:创建的 COM 对象的接口标识符(IID)。ppv
:用来接收指向 COM 对象接口地址的指针变量。
返回值
返回一个 HRESULT 值。具体的值可去 MSDN 对应页面查看。
备注
如果要在本地系统上仅创建一个对象,请调用 CoCreateInstance。要在远程系统上创建单个对象,请调用 CoCreateInstanceEx 函数。要基于单个 CLSID 创建多个对象,请调用 CoGetClassObject 函数。
参考:MSDN CoCreateInstance、百度百科 CoCreateInstance
IUnknown::QueryInterface
通过此方法来查询 COM 对象是否支持某个特定的接口。
Syntax
HRESULT QueryInterface(REFIID riid, void** ppvObject);
Parameters
riid
:指明需要查询的接口的标识符(IID)。ppvObject
:指向 COM 对象中 riid 参数标识的接口指针的地址。
返回值
如果支持该接口,则此方法返回 S_OK,否则返回 E_NOINTERFACE。
备注
因为 IGraphBuilder 是从 IFilterGraph 这个类继承过来的,拥有 IFilterGraph 提供的所有方法。而 IFilterGraph 接口从 IUnknown 这个接口继承过来的,所以 IGraphBuilder 可以执行IGraphBuilder::QueryInterface
。
参考:MSDN IUnknown::QueryInterface method
IGraphBuilder::RenderFile
构建一个渲染特定文件的 filter graph。
Syntax
HRESULT RenderFile(LPCWSTR lpcwstrFile, LPCWSTR lpcwstrPlayList);
Parameters
lpcwstrFile
:指定包含媒体文件名的宽字符字符串。lpcwstrPlayList
:保留参数,必须为 NULL。
返回值
返回一个 HRESULT 值。具体的值可去 MSDN 对应页面查看。
备注
如果 lpwstrFile 参数指定了媒体文件,则该方法将会构建一个 filter graph 来播放。
参考:MSDN IGraphBuilder::RenderFile
IMediaControl::Run
运行 filter graph 中的所有 filter。当 graph 运行时,数据在 graph 中移动并被渲染。
Syntax
HRESULT Run();
Parameters
此函数没有参数。
返回值
返回一个 HRESULT 值。具体的值可去 MSDN 对应页面查看。
备注
如果 filter graph 已停止,则此方法将在运行之前暂停该 graph。如果该 graph 已经在运行,则该方法返回 S_OK,但无效。
成功调用,一般 graph 将一直运行,直到应用程序调用 IMediaControl :: Pause 或 IMediaControl :: Stop 方法为止。当回放到达 stream 的末尾时,graph 将继续运行,但是 filter 不再流化任何数据。此时,应用程序可以暂停或停止 graph。
IMediaEvent::WaitForCompletion
等待 filter graph 渲染所有可用数据。filter graph 必须正在运行,否则该方法将失败。
Syntax
HRESULT WaitForCompletion(long msTimeout, long *pEvCode);
Parameters
msTimeout
:超时时间,以毫秒为单位。传递 0 立即返回。传递值 INFINITE 无限期阻塞。
pEvCode
:指向接收事件代码的变量的指针。
返回值
返回一个 HRESULT 值。可能的值包括:
- S_OK:成功。
- E_ABORT:超时时间已到。
- VFW_E_WRONG_STATE:filter graph 未运行。
备注
该方法将一直阻塞,直到超时到期或发生以下事件之一:
参考:MSDN IMediaEvent::WaitForCompletion
ICaptureGraphBuilder2::SetFiltergraph
为 capture graph builder 指定要使用的 filter graph。
Syntax
HRESULT SetFiltergraph(IGraphBuilder* pfg);
Parameters
pfg
:指向 filter graph 的 IGraphBuilder 接口指针。
返回值
返回一个 HRESULT 值。具体的值可去 MSDN 对应页面查看。
备注
如果不调用此方法,则 capture graph builder 会在需要时自动创建一个 filter graph。如果 capture graph builder 已经具有 filter graph,则此方法返回 E_UNEXPECTED。
参考:MSDN ICaptureGraphBuilder2::SetFiltergraph
ICreateDevEnum::CreateClassEnumerator
创建指定 device category 的 enumerator(枚举)。
Syntax
HRESULT CreateClassEnumerator(
REFCLSID clsidDeviceClass ,
IEnumMoniker ppEnumMoniker ,
DWORD dwFlags
);
Parameters
clsidDeviceClass
:[in]指定 device category 的类标识符(CLSID)。ppEnumMoniker
:[out]接收 IEnumMoniker 接口指针的地址。dwFlags
:[in]0 个或多个标志的按位组合。如果为 0,则该方法枚举类别中的每个 filter。更多标志请查看:ICreateDevEnum::CreateClassEnumerator
返回值
返回一个 HRESULT 值。具体的值可去 MSDN 对应页面查看。
备注
参考:MSDN ICreateDevEnum::CreateClassEnumerator
IMoniker::BindToObject
绑定到指定对象。绑定过程包括查找对象,必要时将其置于运行状态,并为调用者提供指向所标识对象上指定接口的指针。
Syntax
HRESULT BindToObject(
IBindCtx *pbc,
IMoniker *pmkToLeft,
REFIID riidResult,
void ppvResult
);
Parameters
pbc
:指向绑定上下文对象上的 IBindCtx 接口的指针,此绑定操作中使用该指针。pmkToLeft
:此参数主要由 moniker 实现者使用,以启用复合名称的各个组件之间的协作。Moniker 客户端应使用 NULL。riidResult
:用于与 moniker 标识的对象进行通信的接口 IID。ppvResult
:接收 riid中 请求的接口指针的地址。成功返回后,ppvResult 包含指向 moniker 标识的对象的请求接口指针。
返回值
返回一个 HRESULT 值。具体的值可去 MSDN 对应页面查看。
备注
BindToObject 实现了别名的主要功能,该功能是查找由别名标识的对象,并返回指向其接口之一的指针。
参考:MSDN IMoniker::BindToObject method
IFilterGraph::AddFilter
此方法将 filter 添加到 filter graph 并使用 pName 参数对其进行命名。
Syntax
HRESULT AddFilter(IBaseFilter* pFilter, LPCWSTR pName);
Parameters
pFilte
:[in]要加入到 filter graph 中的 filter。pName
:[in] 加入 filter 的名称。
返回值
返回一个 HRESULT 值。具体的值可去 MSDN 对应页面查看。
备注
BindToObject 实现了别名的主要功能,该功能是查找由别名标识的对象,并返回指向其接口之一的指针。
参考:MSDN IMoniker::BindToObject method
IUnknown::AddRef
增加指向 COM 对象的接口指针的引用计数。复制接口指针时,应调用此方法。
Syntax
ULONG AddRef();
Parameters
此函数没有参数。
返回值
该方法返回新的引用计数。此值仅用于测试目的。
备注
COM 对象使用每个接口的引用计数机制来确保该对象不会超出对其的引用。您可以使用AddRef 来稳定接口指针的副本。当克隆指针的寿命必须超过原始指针的寿命时,也可以调用它。必须通过调用 IUnknown::Release 释放克隆的指针。
ICaptureGraphBuilder2::RenderStream
此方法可以将 source filter 上的 output pin 连接到 sink filter,也可以通过中间 filter 连接。
Syntax
HRESULT RenderStream(
const GUID* pCategory,
const GUID* pType,
IUnknown* pSource,
IBaseFilter* pIntermediate,
IBaseFilter* pSink
);
Parameters
pCategory
:[in]指向 AMPROPERTY_PIN_CATEGORY 属性集中的 pin 类别的指针(请参见 Pin属性集)。使用 NULL 可以匹配任何类别。以下列表显示了典型类别。- PIN_CATEGORY_CAPTURE
- PIN_CATEGORY_PREVIEW
- PIN_CATEGORY_CC
pType
:[in]指向主要类型 GUID 的指针,该 GUID 指定输出 pin 的媒体类型;或 NULL 以使用任何 pin,而与媒体类型无关。有关可能值的列表,请参考 Media Types and Sub Types。pSource
:[in]指定一个指向连接的起始 filter 或输出 pin 的指针。pIntermediate
:[in]指向中间 filter (例如压缩 filter)的 IBaseFilter 接口的指针。可以为 NULL。pSink
:[in]指向 sink filter(例如 renderer 或 mux filter)的 IBaseFilter 接口的指针。如果值为 NULL,则该方法使用默认的 renderer(渲染器)。
返回值
返回一个 HRESULT 值。具体的值可去 MSDN 对应页面查看。
备注
该方法通过将两个或多个 filter 连接在一起形成一个流:
- PSource 参数指定链的开始,或者一个 filter 或输出 pin。
- pIntermediate 参数指定的中间 filter,典型地是压缩 filter。此参数可以为 NULL。
- pSink 参数指定链的端部的 filter。通常,此 filter 是用于预览的 renderer,或者是用于文件捕获的多路复用器。
参考:MSDN ICaptureGraphBuilder2::RenderStream
[扩展] 常用 CLSID
CLSID_FilterGraph
:在共享工作线程上创建 Filter Graph Manager。
CLSID_CaptureGraphBuilder2
:用于创建 capture graph builder。
DirectShow 常用函数总结的更多相关文章
- oracle常用函数及示例
学习oracle也有一段时间了,发现oracle中的函数好多,对于做后台的程序猿来说,大把大把的时间还要学习很多其他的新东西,再把这些函数也都记住是不太现实的,所以总结了一下oracle中的一些常用函 ...
- 总结js常用函数和常用技巧(持续更新)
学习和工作的过程中总结的干货,包括常用函数.常用js技巧.常用正则表达式.git笔记等.为刚接触前端的童鞋们提供一个简单的查询的途径,也以此来缅怀我的前端学习之路. PS:此文档,我会持续更新. Aj ...
- [转]SQL 常用函数及示例
原文地址:http://www.cnblogs.com/canyangfeixue/archive/2013/07/21/3203588.html --SQL 基础-->常用函数 --===== ...
- PHP常用函数、数组方法
常用函数:rand(); 生成随机数rand(0,50); 范围随机数时间:time(); 取当前时间戳date("Y-m-d H:i:s"); Y:年 m:月份 d:天 H:当前 ...
- Oracle常用函数
前一段时间学习Oracle 时做的学习笔记,整理了一下,下面是分享的Oracle常用函数的部分笔记,以后还会分享其他部分的笔记,请大家批评指正. 1.Oracle 数据库中的to_date()函数的使 ...
- Thinkcmf:页面常用函数
Thinkcmf:页面常用函数 全站seo: 文章列表: {$site_seo_title} <!--SEO标题--> {$site_seo_keywords} < ...
- matlab进阶:常用功能的实现,常用函数的说明
常用功能的实现 获取当前脚本所在目录 current_script_dir = fileparts(mfilename('fullpath')); % 结尾不带'/' 常用函数的说明 bsxfun m ...
- iOS导航控制器常用函数与navigationBar常用属性
导航控制器常用函数触发时机 当视图控制器的View将要出现时触发 - (void)viewWillAppear:(BOOL)animated 当视图控制器的View已经出现时触发 - (void)vi ...
- 《zw版·Halcon-delphi系列原创教程》 zw版-Halcon常用函数Top100中文速查手册
<zw版·Halcon-delphi系列原创教程> zw版-Halcon常用函数Top100中文速查手册 Halcon函数库非常庞大,v11版有1900多个算子(函数). 这个Top版,对 ...
随机推荐
- LeetCode刷题191130 --基础知识篇 二叉搜索树
休息了两天,状态恢复了一下,补充点基础知识. 二叉搜索树 搜索树数据结构支持许多动态集合操作,包括Search,minimum,maximum,predecessor(前驱),successor(后继 ...
- Httpclient 4.5.2 请求重试机制
重点是HttpRequestRetryHandler.retryRequest()方法 public static String callHttpServer(String contentType,S ...
- MySQL——my.cnf参数设置说明
以下为个人总结的MySQL配置文件参数说明,如有错误,烦请大佬们留言指正,本人将第一时间修改.2019-12-10 12:32:08 [mysqld] server- # Mysql唯一标识,一个集群 ...
- 分组排序函数——row_number()
1.MySQL8.0以上版本 用法1:无分组排序 Row_number() OVER(ORDER BY 字段 DESC)例如:Row_number() OVER(ORDER BY 学生成绩 DESC) ...
- 十ITK读取一张dcm图像然后通过vtk显示
一.功能 通过ITK读取一张图片(dcm格式),然后通过vtk显示出来. 版本:VS2019 itk5.0.1 vtk 8.2.0 二.程序主要思路 1-读取dcm格式图片 2-转换为vtk可以读取的 ...
- Linux基础 —基础要点
一.请简述Linux安装时的两个必备分区.挂载点和类型. 一般情况下,安装红旗Linux需要两个必备分区,即一个根文件系统分区,挂载点(/),类型为ext3.ext2或reiserfs:一个交换分区, ...
- CF 1114D(538,div2) Flood Fill
https://codeforces.com/contest/1114/problem/D 题目 给一串数字,首先选择一个位置,类似于画图,然后每一轮按照以下步骤: 可以将这个位置所在的连通块改成其他 ...
- IT兄弟连 HTML5教程 CSS3揭秘 CSS选择器2
4 结构性伪类选择器 在学习结构性伪类选择器之前,先了解两个概念:伪类选择器和伪元素选择器.伪类选择器是CSS中已经定义好的选择器,不能随便命名.常用的伪类选择器是使用在a元素上的几种,如a:lin ...
- 当面试官要你介绍一下MQ时,该怎么回答?
一.为什么要使用MQ消息中间件? 一个用消息队列的人,不知道为啥用,有点尴尬.没有复习这点,很容易被问蒙,然后就开始胡扯了. 回答:这个问题,咱只答三个最主要的应用场景,不可否认还有其他的,但是只答三 ...
- 前端深入之js篇丨Array数组操作从入门到成神Up Up Up,持续更新中
写在前面 随着前端深入的不断学习,发现数组这个数据结构在前端中有着相当大的存在感,由于我初学前端的时候并没有系统性的学习数组,所以我将通过这篇文章同你一起学习数组,希望我们能一起进步,学会熟练操作数组 ...