2011-05-21 44 views
1

我们创建了一个自定义推送源/解析器过滤器,该过滤器有望在编辑服务时间轴中工作。解析器过滤器应该如何在directshow编辑服务中运行?

现在一切都只是在当前

切达到it's端过滤器不会停止提供样品大。呈现停止,但下游过滤器继续消耗

样本。过滤器提供样本直至达到EOF。这会导致较高的CPU负载,因此应用程序不可用。

大量的调查后,我没能找到一个合适的机制,可以通知我的过滤器

的切割是在这样的过滤器需要停止:

  • 的交付功能所连接的解码器销总是返回S_OK,这意味着附加的译码器

也没有意识到IMediaSamples正在下游丢弃

  • 有在过滤器图表

  • 没有冲洗的IMediaSeeking :: SetPositions接口使用,但仅仅是个开始位置被设置 -

    我们总是指示播放到文件末尾。

    使用时IAMTimelineSrc :: SetMediaTimes(启动,停止)从应用

    ,这将设置停止时间太长,但这种情况不会发生我所期望的。

  • 我还试图操纵XTL时间表加入“MSTOP”属性在

希望这将意味着停止位置被设定所有的剪辑,但无济于事

从过滤器的角度来看,输出缓冲区始终可用(因为IMediaSamples将被丢弃到下游),所以过滤器尽可能快地填充样本,直到源文件完成。

过滤器能够检测何时停止或我们可以从应用程序端执行任何操作吗?

非常感谢

的Tilo

回答

0

你可以尝试添加自定义界面,你的过滤器,并从客户端应用程序调用外部的方法。有关此方法的更多细节,请参阅this SO question。在实现这种方法时,您应该注意线程安全性,并且确实有可能有一种更简洁的方式来检测应该停止捕获。

0

我对DES并不熟悉,但我已经在DES中尝试了我的demux过滤器,并且在剪辑出现“stop =”标记时正确设置了停止时间。

也许您的demux不能正确实现IMediaSeeking。你是否通过引脚暴露IMediaSeeking?

0

我最近有机会使用DES和自定义推送源过滤器。

从我的经验;

  • DES实际上确实将错误代码返回给Receive()调用,当调用到达结束时,它会反过来返回给源的Deliver()。
  • 我遇到类似的情况,即源不接收它并继续运行到流的末尾。
  • 我发现的问题(在大量临时试验之后)是源需要在每次重新启动后调用DeliverNewSegment()方法。 DES似乎只在收到通知后才会收到样本。即使没有通知,DES看起来像S_OK一样接收样本,但它只是丢弃。
  • 我没有看到由IMediaSeeking :: SetPositions的DES设置结束时间。

我希望这可以帮助,当然,这个问题是很老,我想的Tilo没有任何更关心这个...