Pat*_*rik 1 audio buffer signals waveoutwrite waveout
WaveOut API 对当前播放的缓冲区大小是否有一些内部限制?我的意思是,如果我提供一个非常小的缓冲区,它会以某种方式影响扬声器播放的声音吗?当我用小缓冲区生成和播放正弦波时,我遇到了非常奇怪的噪音。类似峰值或“BUMP”的东西。
我编写了一个可以实时生成窦声音信号的程序。可变参数是频率和音量。项目要求最大延迟为 50 毫秒。因此,该程序必须能够实时产生可手动调节音频信号频率的正弦信号。
我使用 Windows WaveOut API、C# 和 P/invoke 来访问 API。
当声音缓冲区大小为 1000 毫秒时,一切正常。如果我根据延迟要求将缓冲区最小化到 50 毫秒,那么对于某些频率,我会在每个缓冲区末尾遇到噪音或“BUMP”。我不明白生成的声音是否格式错误(我检查过但没有),或者音频芯片发生了什么问题,或者初始化和播放过程中出现了一些延迟。
当我将生成的音频保存到 .wav 文件时,一切都很完美。
这意味着我的代码中一定存在一些错误,或者音频子系统对发送给它的缓冲区块有限制。
对于那些不知道 WaveOut 必须首先初始化,然后必须为每个缓冲区准备音频标头,其中包含需要播放的字节数以及指向包含需要播放的音频的内存的指针。成为玩家。
更新
以下组合出现噪声:44100 采样率、16 位、2 通道、50 ms 缓冲区,并生成 201Hz、202Hz、203Hz、204Hz、205Hz ... 219Hz、220Hz、240 Hz 的正弦音频信号,正常
为什么会相差20,我不知道。
当您需要流畅地输出音频时,需要记住以下几点:
waveOutXxxxAPI 是较低级别 API 之上的遗留/兼容层,因此它具有更大的开销,并且当您要达到最小延迟时不建议使用。请注意,这不太可能是您的主要问题,但这是有助于理解的常识waveOutXxxx您不限于拥有单个缓冲区,您可以分配多个可重用缓冲区并回收它们总而言之,waveOutXxxx、DirectSound、DirectShow API 在延迟 50 毫秒及以上的情况下运行良好。使用 WASAPI 独占模式流,您可以获得5 毫秒甚至更低的延迟。
编辑:我似乎说 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
Run Code Online (Sandbox Code Playgroud)