我在 .NET 控制台应用程序中有这段代码,可以使用 NAudio 播放录制的声音检查:
static void Play(int outputDeviceIndex, byte[][] recordedChunks)
{
using (var waveOut = new WaveOutEvent())
{
waveOut.DeviceNumber = outputDeviceIndex;
waveOut.PlaybackStopped += (sender, args) => Console.WriteLine("Playback stopped: " + args.Exception);
var bufferedWaveProvider = new BufferedWaveProvider(new WaveFormat(44100, 1));
waveOut.Init(bufferedWaveProvider);
waveOut.Play();
foreach (var chunk in recordedChunks)
{
bufferedWaveProvider.AddSamples(chunk, 0, chunk.Length);
}
while (waveOut.PlaybackState == PlaybackState.Playing)
{
Thread.Sleep(100);
}
}
}
录制的声音(在recordedChunks中)会回放,但while循环既不会终止,也不会激活waveOut.PlaybackStopped回调。
尝试过这个:
使用(var waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
但对于我来说,上面的原始代码似乎失败了。
这有什么问题吗?感谢所有帮助。 (而且,奇怪的是,我上周以为这有效,但现在不行了?也许我错了!)
BufferedWaveProvider
是永无休止的溪流。它始终提供音频供阅读,即使是无声的。所以播放永远不会结束。
您可以通过将
ReadFully
属性设置为 false
来更改此设置。但在开始玩之前,您还需要更改上面的代码以写入 BufferedWaveProvider
。
此外,
BufferedWaveProvider
在幕后使用循环缓冲区。它适用于实时添加音频的情况。因此,如果您一次性添加所有内容,请小心不要溢出缓冲区。