我可以同时从音频流缓冲区写入和播放(在 NAudio 中)吗?
Posted
技术标签:
【中文标题】我可以同时从音频流缓冲区写入和播放(在 NAudio 中)吗?【英文标题】:Can I write and play from a audio stream buffer at the same time (in NAudio)? 【发布时间】:2013-11-13 20:30:41 【问题描述】:有人指出 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
。我可以自己管理附加到一个字节缓冲区,并在我想播放它们时从其中复制部分,但我想知道是否有一个开箱即用的解决方案。
我正在做的事情的要点是制作一个循环踏板。
【问题讨论】:
【参考方案1】:在 NAudio 中,BufferedWaveProvider
旨在让您在向其中添加音频(例如从声卡或通过网络接收)的同时从中读取音频(例如播放)。
【讨论】:
【参考方案2】:如果您将原始音频数据作为长期缓冲区写入磁盘,那么您将不得不自己处理。
您有两个基本选项,具体取决于您希望如何隔离读取和写入操作:创建一个具有文件读/写访问权限的单个 FileStream
对象,或创建多个 FileStream
对象 - 一个用于写入,以及阅读所需的数量。
第一个选项是最简单的。创建 FileStream
对象时,请确保它具有读写访问权限:
FileStream datafile = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite);
您可以使用Stream
将数据附加到文件中,方法是在调用Write
之前将Position
设置为文件末尾。类似地,从文件中的某个位置读取数据,您将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);
存储数据是(相对)简单的部分。有趣的部分是将数据输入和输出存储。
我将很快更新此答案并提供更多详细信息。让我玩一会儿。
【讨论】:
我了解如何在连续缓冲区中写入和读取 - 我已经为其他项目做到了这一点。我正在寻找的是可以为声音做到这一点的东西。特别是如果我可以开始播放我仍在添加的声音缓冲区。以上是关于我可以同时从音频流缓冲区写入和播放(在 NAudio 中)吗?的主要内容,如果未能解决你的问题,请参考以下文章