Naudio缓冲区和实时流媒体

时间:2015-01-06 15:28:25

标签: c# naudio

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

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让缓冲区放电不是一个好主意......)。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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