我的应用程序是文本转语音应用程序。 我开发了一个基于 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
中请求的字节数。方法将小于排队缓冲区中可用的字节数。
关于c# - Naudio 缓冲区和实时流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27801812/