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

时间:2013-11-13 20:30:41

标签: audio audio-streaming audio-recording playback naudio

我被指向NAudio可能允许我这样做。但是,如果它不能,我会很感激图书馆的建议。我目前在C#/ WPF工作,但很乐意调用其他C / C ++库。

我正在接收连续的音频样本缓冲区(单声道)。类型:16位有符号整数。速率:16 kHz。 我需要保存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。我可以管理自己附加到字节缓冲区,并在我想播放它时复制部分,但我想知道是否有开箱即用的解决方案。

我正在做的主要是做一个循环踏板。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

您有两个基本选项,具体取决于您希望如何隔离读取和写入操作:创建一个具有对文件的读/写访问权限的FileStream对象,或创建多个FileStream对象 - 一个用于写作,无论你需要多少阅读。

第一个选项是最简单的。创建FileStream对象时,请确保它具有ReadWrite访问权限:

FileStream datafile = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite);

您可以使用Stream将数据附加到文件,方法是在调用Position之前将Write设置为文件的末尾。与从文件中的某个位置读取数据类似,您将Position设置为要读取的数据文件的偏移量,然后调用Read

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

在这种情况下,您将使用以下选项创建写入流:

FileStream dataWriter = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.Read);

如果要从文件中读取,请创建一个具有读取权限的新FileStream,如下所示:

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

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

我将在稍后更新此答案并提供更多详细信息。让我玩一会儿。