我可以同时从音频流缓冲区写入和播放(在 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 中)吗?的主要内容,如果未能解决你的问题,请参考以下文章

将音频流写入循环缓冲区但分段错误读取值

同时向 NSMutableArray 写入和读取数据

在 Java 中同时播放多个字节数组

播放流后音频队列无法录制音频

音频录制和播放环回缓冲区问题,将数据写入音轨时出现问题

如何从实时流中播放音频