0

在 DSPACK 组件库的帮助下,我有一个 DirectShow 推送源过滤器和一个 DirectShow 简单音频混合器过滤器,它们都是用 Delphi 6 编写的。在我的应用程序中,我手动构建了一个过滤器图,对于引脚连接,我使用 IFilterGraph.ConnectDirect() 来避免来自 DirectShow 的“智能连接”技术的任何干扰。我将这两个过滤器用作程序内部的私有/未注册过滤器。

我构建的图表有一个捕获过滤器和我的推送源音频过滤器共享图表的头部位置。它们的输出引脚连接到我的简单音频混音器,后者支持多个输入连接。混音器强制其输入和输出引脚的所有连接与其构造函数中预设的媒体格式类型完全相同。在这种情况下,我使用的格式设置是 WAV 格式,采样率为 8000,每个采样 16 位,一个通道。请注意,我使用 DecideBufferSize() 将所有过滤器设置为 50 毫秒的缓冲区大小。这导致交付的缓冲区大小为 400 字节(200 个样本)。

捕获过滤器是我使用 DirectShow API 找到的外部 COM 对象。目前我正在将我的 VOIP 电话分配为设备(Moniker)。出于某种奇怪的原因,我的推源过滤器以恰好是捕获过滤器的 7 倍的速率抽出缓冲区。换句话说,我的混频器过滤器从我的推送源过滤器中获取 7 个缓冲区,用于从捕获过滤器接收到的每个缓冲区。我知道这一点,因为每次混合器过滤器获得缓冲区时我都会调试打印一行,并且我识别出作为缓冲区源的过滤器。

我不知道捕获过滤器是如何形成其时间戳的,因为它是外部代码,但我希望它是通常的方案。我的推送源过滤器从零开始,每次 FillBuffer() 调用都会将 DirectShow 参考时间格式的时间戳增加缓冲区表示的时间量。

以下是我的问题:

1)如果我手动构建图表,时间戳是否重要?即使您完全手动构建图形,DirectShow 是否会介于过滤器之间,并且会以某种方式影响引脚写入(接收呼叫)的时间?

2) 什么常见的错误会导致过滤器过快推出缓冲区,尽管图形周围的媒体格式是同质的?

4

1 回答 1

3

在 DirectShow 中,源/推送过滤器通常是实时的或非实时的。两者都将数据注入管道,重要的区别在于实时过滤器会尽快流式传输数据,一旦生成,就会从管道外部(例如来自网络)接收数据等。

非实时过滤器会推送尽可能多的数据。播放 5 分钟长的 MP3 文件的 fitler?它准备一次注射所有五分钟。渲染器过滤器的任务是在没有更多可用缓冲区时阻止流式传输并尊重呈现时间。因此,当源过滤器加载 100% 的缓冲区时,它不能再推送任何内容,直到缓冲区被播放释放。

此行为的重要部分是正确地为媒体样本添加时间戳。如果未能时间戳,渲染器将无法按时呈现数据,并且可能显示/播放媒体太慢或太快。

于 2011-11-19T07:30:43.207 回答