诺音频缓冲区和实时流

本文关键字:实时 缓冲区 音频 | 更新日期: 2023-09-27 18:36:22

我的应用程序是一个文本到语音转换的应用程序。我开发了一个基于 NAudio 的简单类来播放生成的波形字节数组(其中包含要读取的文本)。这是我的代码:

private BufferedWaveProvider _bufferedWaveProvider = new BufferedWaveProvider(new WaveFormat(16000, 1));
private WaveOut _waveOut = new WaveOut();
public NAudioPlayer(){
_waveOut.Init(_bufferedWaveProvider);
_waveOut.Play();
}
public void Play(byte[] textBytes){
    _bufferedWaveProvider.ClearBuffer();
    _bufferedWaveProvider.AddSamples(textBytes, 0, textBytes.Length);
}

我不知道如何管理缓冲区以防止缓冲区异常。阅读其他帖子,我想过设置缓冲区长度,但我不知道字节数组(由另一个应用程序发送)的最大大小是多少。更重要的是,我想避免在播放时出现意外中断(所以我认为使用 Thread.sleep 让缓冲区放电不是一个好主意......

如何解决这个问题?

诺音频缓冲区和实时流

创建自己的类,类似于 BufferedWaveProvider 中的代码,但具有字节数组队列。每次您有新的音频要播放时,请将其放入队列中。然后在 Read 方法中,依次从每个排队的缓冲区返回字节,直到到达排队音频的末尾,然后返回零(它需要是一个永无止境的流,因此Read必须始终返回 count )。唯一棘手的一点是跟踪您读取的位置,因为 Read 方法中请求的字节数可能会小于排队缓冲区中可用的字节数。