将音频录制到内存流中,然后将其保存到文件中

时间:2018-05-21 19:23:26

标签: c# .net file audio naudio

我正在使用NAudio捕获15秒的音频。像这样:

MemoryStream bufferedVoice = new MemoryStream();
voiceCapturer = new WasapiLoopbackCapture(OutputDevice);
voiceCapturer.DataAvailable += onVoiceOutputReceived;
voiceCapturer.StartRecording();

private void onVoiceOutputReceived(object sender, WaveInEventArgs e)
{
    bufferedVoice.Write(e.Buffer, 0, e.BytesRecorded);    
}

15秒后,我想将其保存到文件中,然后退出。我试过这样但它不起作用:

var ResourceWaveStream = new RawSourceWaveStream(bufferedVoice, voiceCapturer.WaveFormat);
var SampleProvider = new WaveToSampleProvider(ResourceWaveStream).ToWaveProvider16();
var fileWriter = new WaveFileWriter("output.mp3", SampleProvider.WaveFormat);

byte[] buf = new byte[8192];
while(SampleProvider.Read(buf, 0, buf.Length) > 0)
{
    fileWriter.Write(buf, 0, buf.Length);
}
fileWriter.Dispose();

如何将内存流保存到文件中?

澄清:我只想在内存中存储x秒的音频。因此,当达到最大尺寸时,将移除一些最旧的部分。然后,如果我按下一个按钮,我想将15秒的音频保存到文件中。

现在,我的问题是如何将音频存储在内存中,然后将其写入文件?

2 个答案:

答案 0 :(得分:1)

试试这个:

using(var fileWriter = new WaveFileWriter("yourOutputFile", SampleProvider.WaveFormat)
{
    ResourceWaveStream.CopyTo(fileWriter);
}

顺便说一下,“using”块对你有好处,因为它会自动处理编写器,允许WaveFileWriter将头文件写入文件。

答案 1 :(得分:0)

好的,我终于有了解决方案。首先,我将声音数据直接复制到内存流中。然后当我需要它时,我将整个内存流读入RawSourceWaveStream,然后将其传递给最终WaveFileWriter。如果有人对我的确切方式感兴趣,请给我留言。

感谢。