正文

Direcshow中视频捕捉和参数设置报告-32006-04-19 10:57:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/ddtme/12740.html

分享到:

5.      如何控制Capture Graph(Controlling 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通知。wStartCookie和wStopCookie是作为第二个参数的。 看看事件通知处理过程吧  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 流则要等到你设置的时间运行。

阅读(14096) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册