directshow过滤器图表-graph builder使用时的几点注意事项(易犯错误解析)

下面提到的几点注意事项是我用directshow做项目时遇到的问题和解决了这些问题之后相应的理解及心得,希望与正在学习directshow的同伴们互勉,尽量少走点弯路,由于小弟也是新手,菜鸟一个,所以下面提到的一些理解也可能有疏漏之处,还请前辈们不吝赐教。

1.尽量不要将不再使用的filter留在过滤器图表中。因为很多莫名其妙的错误都是在这种情况下发生的,具体原因是大家在做directshow开发时不可避免的会遇到很多智能连接的情况,如果有游离的filter存在graph builder中,而且其merit值为可用,那么智能连接很可能会使用这些filter,自定义的filter更容易出现这些问题。所以,不要有这些无用的filter的对象,使用完就释放掉,不要使其游离。最彻底的方法是先removefilter,然后将其对象指针置为NULL。因为removefilter只是断开其与上、下游filter的连接,这在某些情况下也是有用的,比如你不想彻底释放该filter,以后还会用到。

2.Smart Tee的使用需谨慎。Smart Tee共有三个引脚:Input、Preview、Capture,一个输入,两个输出。其中Preview是会去掉时间戳的。我们经常会使用RenderStream做视频采集的智能连接,那么就要注意了,如果第一个参数使用了&PIN_CATEGORY_PREVIEW、&PIN_CATEGORY_CAPTURE,那么这个过滤器链上会自动加上smart Tee的对象。这种情况下也会产生很多莫名其妙的问题。而且注意第三个参数一定是源,绝对的源,而不仅仅只是有一个输出pin就可以。那么对于smart Tee的使用上不能完全依赖于RenderStream,需要做一些手动连接,无非就是调用graph builder的Connect、ConnectDirect方法,也不是很麻烦。

3.有时在使用vmr时会遇到视频流的帧交互闪烁问题。这里我只提一种情况,那就是使用多个过滤器图表的情况下。我们可能有多个vmr渲染器,如果这几个vmr都绑定到一个特定的窗口上,而且不止一个vmr正处在运行状态下,那么就会发生刚才提到的问题。可能你会说,既然这样,我们何不在多个过滤器图表中使用同一个vmr。呵呵,你就要好好想清楚了,这种情况下,该vmr的状态怎么维持呢,都使用同一个vmr,有的过滤器图表处在运行状态下,有的是暂停、停止,这对于同一个指针是无法办到的,换句话说,这种情况下,使用多个过滤器图表是没什么意义的。所以,在设计多过滤器图表时要充分考虑类似这种问题。

先说这几点吧,以后有什么感悟再添上去,希望这篇文章对大家有所帮助。

你可能感兴趣的:(注意事项,directshow,directshow,directshow,易犯错误,过滤器图表)