首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

怎么单独控制Capture和Preview的开始与暂停

2012-03-19 
如何单独控制Capture和Preview的开始与暂停?Graph为:Capture Filter-smart tee-capture pin-ffdshow vi

如何单独控制Capture和Preview的开始与暂停?
Graph为:Capture Filter->smart tee->capture pin->ffdshow video encoder->avi mux->filter writer

  小弟在使用Directshow做视频采集的时候使用了::ControlStream()来对Capture进行采集控制而对Preview未进行控制,我发现当使用ControlStream()停止了Capture之后后面的Video encoder仍然在工作,也就是说我用ControlStream开始(10s)->停止(10s)->开始(10s)控制之后,采集到的图像在中间那段停止的时间也保存在里面(10+10+10s),而中间那段停止的时间的画面是静止不动的,请问这个问题如何解决?

REFERENCE_TIME rtStart = 0, rtStop = MAXLONGLONG;
const WORD wStartCookie = 1, wStopCookie = 2; // Arbitrary values.
// TODO: 在此添加控件通知处理程序代码
if(gcap.fCapturing)
{
gcap.pBuilder->ControlStream(
&PIN_CATEGORY_CAPTURE, // Pin category.
&MEDIATYPE_Video, // Media type.
gcap.pVCap, // Capture filter.
0, &rtStop, //Stop now // Start and stop times.
wStartCookie, wStopCookie // Values for the start and stop events.
);
gcap.fCapturing=false;
}
else
{
gcap.pBuilder->ControlStream(
&PIN_CATEGORY_CAPTURE, // Pin category.
&MEDIATYPE_Video, // Media type.
gcap.pVCap, // Capture filter.
NULL,0, //Start now // Start and stop times.
wStartCookie, wStopCookie // Values for the start and stop events.
);
gcap.fCapturing=true;
}
StartGraph();

[解决办法]
因为数据源时间戳在增加,比如数据源从0开始, 10秒钟之后数据源时间为10,虽然你不继续录制了,但到20秒的时候,数据源时间戳也是20秒, 往文件里面写的时候也是记录20,所以中间那段虽然没数据,但还是保持不动。要解决此问题,需要在capture pin后面自己做一个Filter,用这个来控制数据,每当暂停录像时,记录暂停的时间,然后恢复时,把当前每个包的时间戳-暂停的时间。

热点排行