我目前正在使用旧的MME API(waveOutXxx函数)输出FP32样本。我遇到的问题是,如果我提供的缓冲区长度不能均匀地划分采样率,则音频流中会出现某些可听见的咔嗒声;当录制时,看起来有些样本丢失了(我正在为测试生成正弦波)。目前,我使用每个缓冲区2205个样本的“魔术”值,44100采样率。
问题是,有没有人知道这些辍学的原因,是否有一些神奇的公式提供了一种计算“适当”缓冲区大小的方法?
答案 0 :(得分:2)
数据缓冲区的安全对齐是WAVEFORMATEX
结构的nBlockAlign
的值。
软件必须在a处理多个nBlockAlign字节数据 时间。 写入设备和从设备读取的数据必须始终从 阻止开始。例如,开始播放是非法的 PCM数据位于样本中间(即,在非块对齐的情况下) 边界)。
对于PCM格式,这是所有通道中单个样本的字节数。非PCM格式具有它们自己的对齐,通常等于格式特定块的长度,例如, 20毫秒。
当waveOutXxx
是音频的主要API时,及时携带未对齐的字节是API的不合理负担和不必要的性能开销。现在这个API是在其他音频API之上的兼容层,我认为未对齐的字节只是被剥离以仍然播放剩余的内容,否则由于这个小故障可能会被完全拒绝,这可能只是一个较小且非致命的来电者不准确。
答案 1 :(得分:0)
如果用正弦样本填充音频缓冲区并播放它,很容易点击,除非缓冲区长度不是频率的倍数,正如你所说的......听到的咔嗒声实际上是不连续的wave ...一个先进的技术是用dinamically填充缓冲区,也就是说,你应该在缓冲区指针前进时设置一个回调通知,并在适当的偏移处用适当的数据填充缓冲区。我会使用更大的缓冲区,因为2205太短而无法获得异步通知,计算数据和写入缓冲区,所有这些都在播放时,但它将取决于CPU功率