我被指向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
。我可以管理自己附加到字节缓冲区,并在我想播放它时复制部分,但我想知道是否有开箱即用的解决方案。
我正在做的主要是做一个循环踏板。
答案 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);
存储数据是(相对)简单的部分。有趣的部分是将数据输入和输出商店。
我将在稍后更新此答案并提供更多详细信息。让我玩一会儿。