如何在生成音频数据时创建模拟捕获过滤器精确定时的线程?

时间:2011-11-19 16:46:24

标签: winapi directshow performancecounter

我有一个DirectShow推送源过滤器,用于累积带时间戳的自定义音频流中的数据。它缓冲它们,然后将它们发送到外部音频输出设备,该设备通过设备提供的HTTP服务器接受音频缓冲区(通过HTTP提交音频缓冲区)。遗憾的是,音频输出设备对时序敏感。一次发送太多数据或者(自然地)一次发送的数据太少会使其混乱并导致播放问题,例如“口吃”。

我需要以精确的时间间隔通过HTTP连接发送缓冲区,就像使用基于硬件的采样和时钟的捕获设备在发布捕获数据时一样。我假设我必须创建一个实时关键线程并使用它。以下是我的问题:

  1. 我该如何做时机?我使用什么Windows API调用和数据结构来正确执行此操作?使用Windows性能计数器功能的东西?

  2. 当我还没准备好在我的推送源过滤器的FillBuffer()方法中发布任何数据时,如何阻止?互斥?旗语?

  3. 如何避免漂移?例如,如果我需要生成一个50毫秒的缓冲区并且我正在模拟8000的采样率,我该如何确保我不会以一种随时间累积的方式低估或超出计算的发布时间,可能导致音频中的空白?

1 个答案:

答案 0 :(得分:0)

关于时间和漂移;你可以做到以下几点:

  • 开始流式传输时,请将当前时间存储在StreamingPos
  • 现在每次发送50毫秒时,都会将StreamingPos增加50毫秒。
  • 在当前时间达到StreamingPos之前不要发送任何进一步的数据。

这样您就可以将数据速率同步到本地系统时间。这不需要与播放器设备的时钟完全匹配。但那应该不是问题。解决这个问题的唯一方法是让两个设备同时使用相同的时间源。