我可以同时从音频流缓冲区写入和播放吗(在NAudio中)?

我可以同时从音频流缓冲区写入和播放吗(在NAudio中)?,audio,audio-streaming,audio-recording,playback,naudio,Audio,Audio Streaming,Audio Recording,Playback,Naudio,有人指出NAudio可能允许我这样做。然而,如果它不能,我将感谢图书馆的建议,可以。我目前在C#/WPF中工作,但很乐意调用其他C/C++库 我正在接收音频样本(单声道)的连续缓冲区。类型:16位有符号整数。频率:16千赫。 我需要保存1-2小时的缓冲区数据(230 MB)。我想将此缓冲区保存到磁盘,以便以后检索 需要能够在捕获的同时播放部分缓冲区,例如: @0s, Buffer.StartRecording() @30s, handle = Buffer.Play(20,25) //Plays

有人指出NAudio可能允许我这样做。然而,如果它不能,我将感谢图书馆的建议,可以。我目前在C#/WPF中工作,但很乐意调用其他C/C++库

我正在接收音频样本(单声道)的连续缓冲区。类型:16位有符号整数。频率:16千赫。 我需要保存1-2小时的缓冲区数据(230 MB)。我想将此缓冲区保存到磁盘,以便以后检索

需要能够在捕获的同时播放部分缓冲区,例如:

@0s, Buffer.StartRecording()
@30s, handle = Buffer.Play(20,25) //Plays the buffer from 20 - 25 s
@50s, handle1 = Buffer.Play(20,25)
@51s, handle2 = Buffer.Play(20,25) //Playing two parts of the buffer at the same time.
@52s, handle1.Stop() //Buffer1 stops playing after having played for 2 seconds.
我应该可以开始播放一个尚未写完的声音:

@0s, Buffer.StartRecording()
@25s, handle = Buffer.Play(20,30) //Plays the buffer from 20 - 30 s
@30s, //Buffer has played halfway through (currently, play marker is at 25 s
@35s, //Buffer playing finishes.
需要能够屏蔽部分播放缓冲区,例如:

bufferMaskStep = 1 //seconds
bufferMask = [1, 0, 0.5, 1, 0.1] //the volumes at each time step
Buffer.Play(20, 25, bufferMask, bufferMaskStep)
我看到NAudio提供了
WaveStream
,但显然不支持
WaveStream.Write
。我可以自己添加一个字节缓冲区,并在我想播放时从中复制部分,但我想知道是否有现成的解决方案


我所做的要点是制作一个循环踏板。

如果您将原始音频数据作为长期缓冲写入磁盘,那么您必须自己处理它

根据要隔离读写操作的方式,您有两个基本选项:创建一个对文件具有读/写访问权限的
FileStream
对象,或创建多个
FileStream
对象—一个用于写入,另一个用于读取

第一种选择是最简单的。创建
FileStream
对象时,请确保该对象具有读写访问权限:

FileStream datafile = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite);
在调用
Write
之前,通过将
位置设置为文件末尾,可以使用该
向文件追加数据。与从文件中的某个位置读取数据类似,您可以将
位置设置为要读取的数据在文件中的偏移量,然后调用
read

另一个选项有点困难,但是在读操作和写操作之间有一定的间隔。创建每个
FileStream
对象时,需要指定
FileShare
选项,以允许同一文件的多个视图

在此场景中,您将使用以下选项创建写入流:

FileStream dataWriter = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.Read);
当您要从文件中读取时,请创建一个新的具有读取权限的
FileStream
,如下所示:

FileStream dataReader = new FileStream(filename, FileMode.Open, FileAccess.Read);

存储数据是(相对)简单的部分。有趣的是将数据进出商店


我将很快更新这个答案,并提供更多细节。让我用它玩一会儿。

在NAudio中,
BufferedWaveProvider
的设计使您可以在向其中添加音频(例如从声卡或通过网络接收)的同时从中读取音频(例如从中播放)。

我了解如何从连续缓冲区写入和读取数据-我为其他项目做过这项工作。我要找的是一种能发出声音的东西。特别是如果我能开始播放我还在添加的声音缓冲区。