什么可能导致DirectShow推送源过滤器以比预期更快的速度推出数据?

时间:2011-11-19 06:38:13

标签: delphi filter directshow dspack

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

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

捕获过滤器是我使用DirectShow API找到的外部COM对象。目前我正在将我的VOIP手机指定为设备(Moniker)。由于一些奇怪的原因,我的推源滤波器以比捕获滤波器正好7倍的速率抽出缓冲器。换句话说,我的混音器滤波器从我的推送源滤波器获取7个缓冲区,用于从捕获滤波器接收的每个缓冲区。我知道这是因为每次混音器滤波器获得缓冲区时我都会调试打印一行,并且我确定了作为缓冲区源的滤波器。

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

以下是我的问题:

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

2)尽管图表周围有均匀的媒体格式,但是哪种常见错误可能会导致过滤器过快地推出缓冲区?

1 个答案:

答案 0 :(得分:3)

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

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

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