微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Windows播放audio有多准确按时间?

比方说,我用317520000个样本播放立体声WAV文件, 理论上 1小时。 假设没有中断播放,文件将在一个小时内完成播放,或者在播放速度上有一些偶尔的细微变化,使得它稍微多一些或略less一些(几毫秒)一个小时?

我正在尝试与audio同步animation,并且我正在使用System.Diagnostics.Stopwatch来保持与audio匹配的帧。 但是,如果Windows中WAVaudio的播放速度可能随着时间的推移稍微变化,那么audio将会与秒表驱动的animation不同步。

这导致了第二个问题:看起来, Stopwatch – 虽然高度精确和短期持续,但运行速度稍快。 在我的笔记本电脑上,24小时跑步(根据计算机的系统时间和实际秒表测量)显示24小时耗时约5秒(而非毫秒)。

这是Stopwatch已知的问题吗? (一个相关的问题是“我疯了吗?”,但你可以自己尝试一下。)鉴于它作为一个诊断工具的使用,我可以看到这种差异只会出现在测量长时间,其中大多数人们会使用Stopwatch以外的东西。

User32 API自定义PostMessage进行自动

我想创build一个安装在远程服务器上的应用程序安装程序

Linux单声道等效的.NET Windows服务

如何从Windows执行一个Unix shell脚本

如何使用Web服务将批处理模式下的条形码扫描器连接到Web应用程序?

如果我真的很幸运,那么Stopwatch和audio播放都是由相同的底层机制驱动的,因此会一直保持同步。 这是真的吗?

更新 :我只是做了math,如果Stopwatch在24小时内漂移5秒,这意味着它会在172秒后漂移10毫秒。 所以在3分钟之内,animation就会开始明显不同步。

我正在尝试周期性地(每10秒左右)从waveOutWritecallback重新启动计时器,但是这不起作用,因为那么整个下一个计时器事件集合被callback的不准确性所抵消。 糟透了就是我。

WIX相对path过长

在Windows中检测笔记本电脑上的耳机

在同一进程中创build的所有其他线程之后停止线程

在Ubuntu机器上通过jenkins代码发布.net MVC解决scheme

如何确定我的.NET Windows Forms程序运行在哪个监视器上?

没有时钟会“准确地”测量时间,因为所有的物理设备必然会有一些变化和测量错误。 这意味着所有的时钟都会稍微太快或太慢(尽管错误数量可能会大不相同,具体取决于时钟)。

在你的情况下,音频输出由驱动DAC的声卡上的时钟驱动。 我不知道.NET平台,但我认为秒表是某种类型的系统计时器,这意味着它是由一个不同的时钟(大概是你的主板上的一个)驱动的。

现在总的来说,两个不同的物理时钟永远不会以完全相同的速度运行 – 出于上述原因。 这是你得到的差异来自哪里。 同样的事情会发生在你的动画上 – 你永远不能假定系统时钟和声卡的DAC时钟是一样的 – 它们会有所不同!

这意味着如果你想保持两个流(视频和音频)同步,它们必须由相同的时钟驱动。 由于您无法更改驱动声卡的时钟,所以将所有内容同步到声卡是一个不错的选择。

Larry Osterman在评论中提供了答案:

FWIW,在Windows中,视频时钟由音频时钟驱动。 如果您正在渲染音频,则通过调用waveOutGetPosition来获取音频时钟(因为音频是等时的,位置会随着时间直接被腐蚀)。 所有其他音频渲染API都有一个类似的“GetPosition”API,可用于确定音频渲染位置。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐