关于delphi:为什么将渲染器添加到DirectShow过滤器图表中会使输入的音频变得平滑?

Why does adding a renderer to my DirectShow Filter Graph smooth out audio input to the graph?

在使用DSPACK组件库构建的Delphi 6应用程序中,我有一个DirectShow过滤器图。图的结构如下:

  • 自定义推送源音频过滤器
  • 样品采集器
  • Tee筛选器(但仅当我同时打开WAV File Writer和Renderer时)
  • 渲染器(首选的PC输出设备)
  • WAV文件编写器

仅当我同时启用了Renderer和WAV File Writer过滤器时,才会将Tee过滤器添加到图形中。否则,我只能将直接打开的滤波器连接到Sample Grabber。

正在通过WiFi连接的RTSP音频服务器传送音频,该服务器实时流式传输音频。如果我不打开Wav File Writer,则从我的耳机中发出的音频将具有典型的泵送声音,并偶尔出现与无缓冲音频流相关的咔嗒声。奇怪的是,一旦我打开WAV File Writer过滤器,音频就会像玻璃一样平滑。

我有WAV File Writer的源代码,它基本上处理以下任务:在需要时输出正确的WAV文件头,并根据需要写入音频缓冲区,仅此而已。因此,我感到奇怪的是,将其打开会平滑传入的音频流,尤其是因为它不在Renderer(过滤器)的上游,而是对等过滤器挂在Tee过滤器末端与Renderer旁边。

有人可以告诉我,当我打开File Writer过滤器时,如何使音频传输平稳? Tee过滤器是否进行任何固有的缓冲?我想复制相同的机制,以便在未打开File Writer的情况下获得流畅的音频。我试图避免添加自己的缓冲,因为我不想给实时音频流增加比我需要的更多延迟。


如果您有直播源,并且可以同时收听它和所提供的音频,则可以判断添加File Writer是否引入了延迟,这可能是造成差异的原因。或者DecideBufferSize中的大小或协商缓冲区的数量可能有所变化。

我建议在推式过滤器中引入显式缓冲,例如为媒体采样时间戳添加偏移量。 Tee过滤器中的固有缓冲可能不可靠。交货时间的变化是不可避免的。

一种更复杂的方法,如果您需要在最小缓冲或无缓冲的情况下运行,则可以在保留音高的同时拉伸/压缩音频。