0

有人指出 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不支持。我可以自己管理附加到一个字节缓冲区,并在我想播放它们时从其中复制部分,但我想知道是否有一个开箱即用的解决方案。

我正在做的事情的要点是制作一个循环踏板。

4

2 回答 2

1

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

于 2013-11-14T17:26:35.213 回答
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);

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

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

于 2013-11-14T02:38:29.347 回答