惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
N
Netflix TechBlog - Medium
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园_首页
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
Hugging Face - Blog
Hugging Face - Blog
量子位
Blog — PlanetScale
Blog — PlanetScale
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
阮一峰的网络日志
阮一峰的网络日志
D
Docker
罗磊的独立博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
云风的 BLOG
云风的 BLOG
IT之家
IT之家
MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - 物质法则

Direcshow中视频捕捉和参数设置报告-5 Direcshow中视频捕捉和参数设置报告-4 Direcshow中视频捕捉和参数设置报告-2(转) Direcshow中视频捕捉和参数设置报告-1(转) GridView的一点用法 GridView控件修改、删除示例(修改含有DropDownList控件) - 物质法则 - 博客园 数据层组件设计与数据传递一 自定义实体类简介 css阴影效果 Ajax问题集(不断更新) Start with Ajax.NET 可输入的select JS代码小集合 ajax即时保存 如何访问Formview中的控件 CIU软考联盟:软件设计师试题解析-数据结构篇 CIU软考联盟:软件设计师上午试题解析-操作系统篇 CIU软考联盟:软件设计师(高程)试题解析-软件工程篇 软设考点精要,精确到每页!
Direcshow中视频捕捉和参数设置报告-3
物质法则 · 2008-07-22 · via 博客园 - 物质法则

5.      如何控制Capture GraphControlling Capture Graph

Filter图表管理器可以通过IMediaControl接口控制整个graph的运行,停止和暂停。但是当一个graph有捕捉和预览两个数据流的时候,如果我们想单独的控制其中的一个数据流话,我们可以通过ICaptureGraphBuilder2::ControlStream

下面讲一下如何来单独控制捕捉和预览数据流。

1 控制捕捉视频流

下面的代码,让捕捉数据流在graph开始运行1秒后开始,允运行4秒后结束。

// Control the video capture stream.

REFERENCE_TIME rtStart = 1000 0000, rtStop = 5000 0000;

const WORD wStartCookie = 1, wStopCookie = 2; // Arbitrary values. hr = pBuild->ControlStream(

&PIN_CATEGORY_CAPTURE, // Pin category.

&MEDIATYPE_Video, // Media type.

pCap, // Capture filter.

&rtStart, &rtStop, // Start and stop times.

wStartCookie, wStopCookie // Values for the start and stop events.
 );

pControl->Run();

第一个参数表明需要控制的数据流,一般采用的是pin种类GUID

第二个参数表明了媒体类型。

第三个参数指明了捕捉的filter。如果想要控制graph图中的所有捕捉filter,第二个和第三个参数都要设置成NULL

第四和第五个参数表明了流开始和结束的时间,这是一个相对于graph开始的时间。

只有你调用IMediaControl::Run以后,这个函数才有作用。如果graph正在运行,这个设置立即生效。

最后的两个参数用来设置当数据流停止,开始能够得到的事件通知。对于任何一个运用此方法的数据流,graph当流开始的时候,会发送EC_STREAM_CONTROL_STARTED通知,在流结束的时候,要发送EC_STREAM_CONTROL_STOPPED通知。wStartCookiewStopCookie是作为第二个参数的。

看看事件通知处理过程吧

 while (hr = pEvent->GetEvent(&evCode, &param1, &param2, 0), SUCCEEDED(hr))

 {

 switch (evCode)

 {

 case EC_STREAM_CONTROL_STARTED:

 // param2 == wStartCookie

 break;

 case EC_STREAM_CONTROL_STOPPED:

 // param2 == wStopCookie

 break;

 }

 pEvent->FreeEventParams(evCode, param1, param2);

 }

ControlStream还定义了一些特定的值来表示开始和停止的时间。

MAXLONGLONG 从不开始,只有在graph停止的时候才停止

NULL 立即开始和停止

例如,下面的代码立即停止捕捉流。

 pBuild->ControlStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, 0, 0, // Start and stop times.

 wStartCookie, wStopCookie);

2控制预览视频流

只要给ControlStream第一个参数设置成PIN_CATEGORY_PREVIEW就可以控制预览pin,整个函数的使用和控制捕捉流一样,但是唯一区别是在这里你没法设置开始和结束时间了,因为预览的视频流没有时间戳,因此你必须使用NULL或者MAXLONGLONG。例子

 Use NULL to start the preview stream:

 pBuild->ControlStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, // Start now.

 0, // (Don't care.)

 wStartCookie, wStopCookie);

 Use MAXLONGLONG to stop the preview stream:

 pBuild->ControlStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, 0, // (Don't care.)

 MAXLONGLONG, // Stop now.

 wStartCookie, wStopCookie);

3关于数据流的控制

Pin的缺省的行为是传递sample,例如,如果你对PIN_CATEGORY_CAPTURE使用了ControlStream,但是对于PIN_CATEGORY_PREVIEW没有使用该函数,因此,当你run graph的时候,preview 流会立即运行起来,而capture 流则要等到你设置的时间运行。