gpt4 book ai didi

audio - 使用 WaveOUT API 产生无失真的 Tone 声音所需的最小音频缓冲区是多少

转载 作者:行者123 更新时间:2023-12-02 22:50:23 28 4
gpt4 key购买 nike

WaveOut API 是否对当前播放的缓冲区大小有一些内部限制?我的意思是,如果我提供一个非常小的缓冲区,它是否会以某种方式影响播放到扬声器的声音。当我用小缓冲区生成和播放正弦波时,我遇到了非常奇怪的噪音。像高峰或“BUMP”之类的东西。

完整的故事:

我做了一个可以实时生成窦性声音信号的程序。
可变参数是频率和音量。项目要求最大延迟为 50 毫秒。因此该程序必须能够实时产生具有手动可调音频信号频率的正弦信号。

我使用 Windows WaveOut API、C# 和 P/invoke 来访问 API。

当声音缓冲区为 1000 毫秒时,一切正常。如果我根据延迟要求将缓冲区最小化到 50 毫秒,那么对于我在每个缓冲区结束时遇到的某些频率,会出现噪音或“BUMP”。我不明白生成的声音是否格式错误(我检查过但不是)或者音频芯片发生了什么问题,或者初始化和播放有一些延迟。

当我将制作的音频保存到 .wav 文件时,一切都很完美。

这意味着我的代码中一定有一些错误,或者音频子系统对发送给它的缓冲区 block 有限制。

对于那些不知道 WaveOut 必须首先初始化的人,然后必须为每个缓冲区准备好包含需要播放的字节数的音频头以及指向包含需要播放的音频的内存的指针成为玩家。

更新

以下组合会产生噪音 44100 SamplingRate、16 位、2 channel 、50 ms 缓冲区和生成的 201Hz、202Hz、203Hz、204Hz、205Hz ... 219Hz 的 Sinus 音频信号,
220Hz,240Hz,没问题

为什么相差20,我不知道。

最佳答案

当您需要流畅地输出音频时,需要牢记以下几点:

  • waveOutXxxx API 是较低级别 API 之上的遗留/兼容性层,因此它具有更大的开销,当您要达到最小延迟时不建议这样做。请注意,这不太可能是您的主要问题,但这是有助于理解
  • 的一般知识。
  • 因为 Windows 不是实时操作系统,它的音频子系统也不是实时的,或者您无法控制在将音频数据排队以供输出和数据真正播放之间所涉及的随机延迟,关键是要保持一定程度的缓冲区充满度它可以保护您免受播放下溢并提供流畅的播放
  • waveOutXxxx您不仅限于拥有单个缓冲区,您可以分配多个可重复使用的缓冲区并回收它们

  • 总而言之,waveOutXxxx、DirectSound、DirectShow API 在延迟 50 毫秒及以上的情况下运行良好。使用 WASAPI 独占模式流,您可以 get 5 ms latencies and even lower .

    编辑:我似乎太早说了大约 20 毫秒的延迟。为了弥补这一点,这里有一个简单的工具 LowLatencyWaveOutPlay ( Win32 , x64 ) 来估计你可以达到的延迟。有足够的缓冲播放是流畅的,否则你会听到卡顿。

    我的理解是,缓冲区可能会被延迟返回,并且在最小延迟方面的最佳设计在于拥有更多更小的缓冲区,以便尽早将它们归还。例如,10 个缓冲区 3 ms/缓冲区而不是 3 个缓冲区 10 ms/缓冲区。
    D:\>LowLatencyWaveOutPlay.exe 48000 10 3
    Format: 48000 Hz, 1 channels, 16 bits per sample
    Buffer Count: 10
    Buffer Length: 3 ms (288 bytes)
    Signal Frequency: 1000 Hz
    ^C

    关于audio - 使用 WaveOUT API 产生无失真的 Tone 声音所需的最小音频缓冲区是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14293749/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com