Directshow Filters如何交换媒体样本?

时间:2014-07-20 15:15:15

标签: audio directshow audio-streaming visual-c++-2010 audio-processing

有谁知道directshow过滤器如何交换媒体样本?

我们知道源过滤器抓取样本(来自MIC或Live)并将其传递给图中的下一个过滤器。

显然我想知道过滤器如何将样本传递给另一个过滤器?

有一个已知的模式吗?

如果我决定实施没有任何第三方组件的音频处理过滤器, 是否可以使用多生产者/消费者队列实现媒体样本交换?

说源滤波器F1是媒体捕获滤波器,滤波器F2是DSP滤波器。

F1写入多生产者/消费者队列,如果有任何可用样本,则F2消耗由F1排队的捕获样本。(我考虑多生产者/消费者队列,因为在某些情况下,一个过滤器可以有多个输出,多一个输入并且每个过滤器都有它自己的线程)。 有没有更好的方法?

  

*编辑:我们的解决方案必须看起来像Publisher Subscriber模式,但我认为这不适合媒体处理。

非常感谢你

1 个答案:

答案 0 :(得分:2)

MSDN在Overview of Data Flow in DirectShow中提供了非常详细的说明。您需要整篇文章,这是关于过滤器之间专门交换数据的摘录:

  

[...]每当过滤器需要用数据填充缓冲区时,它通过调用IMemAllocator :: GetBuffer从分配器请求样本。如果分配器具有当前未被另一个过滤器使用的任何样本,则GetBuffer方法立即返回指向样本的指针。如果所有分配器的样本都在使用中,则该方法将阻塞,直到样本可用。当方法确实返回样本时,过滤器将数据放入缓冲区,在样本上设置适当的标志(通常包括时间戳),并将样本传递到下游。 [...]