我能够使用naudio将音频捕获到文件中,现在我希望它在byte []或stream in c#。
this.writer = new WaveFileWriter(this.outputFilename, this.waveIn.WaveFormat);
我到目前为止尝试的是在WaveFileWriter构造函数中传递输出文件名,而不是传递MemoryStream对象。参考流对象,我试着在录制结束后使用Soundplayer播放它。
private IWaveIn waveIn;
private WaveFileWriter writer;
private string outputFilename;
private Stream memoryStream;
public void onRecord(object inputDevice, string fileName)
{
if (this.waveIn == null)
{
this.outputFilename = fileName;
this.waveIn = new WasapiLoopbackCapture((MMDevice)inputDevice);
if(memoryStream == null)
memoryStream = new MemoryStream();
this.writer = new WaveFileWriter(this.memoryStream,this.waveIn.WaveFormat);
this.waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(this.OnDataAvailable);
this.waveIn.RecordingStopped += new EventHandler<StoppedEventArgs>(this.OnRecordingStopped);
this.waveIn.StartRecording();
}
}
private void OnDataAvailable(object sender, WaveInEventArgs e)
{
this.writer.Write(e.Buffer, 0, e.BytesRecorded);
}
public void OnRecordingStopped(object sender, StoppedEventArgs e)
{
if (this.waveIn != null)
{
this.waveIn.Dispose();
this.waveIn = null;
}
if (this.writer != null)
{
this.writer.Close();
this.writer = null;
}
}
出于测试目的,我创建了以下代码,以检查它是否能够播放录制的音频。
System.Media.SoundPlayer soundPlayer = new System.Media.SoundPlayer();
memoryStream.Position = 0;
soundPlayer.Stream = null;
soundPlayer.Stream = memoryStream;
soundPlayer.Play();
但是当我尝试以上方式时,我得到了System.ObjectDisposedException:无法访问已关闭的Stream。在 memoryStream.Position = 0; 这一行。我没有处理流对象,不知道它究竟在哪里处理。
答案 0 :(得分:5)
正如马克建议的那样,我将memoryStream
与IgnoreDisposeStream
包裹起来并且有效。
this.writer = new WaveFileWriter(new IgnoreDisposeStream(memoryStream),this.waveIn.WaveFormat);
答案 1 :(得分:0)
不要创建内存流。使用System.Media.SoundPlayer作为Stream。
byte[] buff = new byte[1024]; //or bigger...
System.Media.SoundPlayer soundPlayer = new System.Media.SoundPlayer();
soundPlayer.Stream.Read(buff, 0, (buff.Length - 1));
答案 2 :(得分:0)
SoundPlayer类不是很好用,因为它在开始播放之前读取整个流。它还要求流为Wave文件格式,因此您必须使用WaveFileWriter写出所有您的音频数据,然后才能将该流与SoundPlayer一起使用。
我建议您使用NAudio的WaveOutEvent(或类似功能)来进行音频输出。这样做可以消除对Stream的需求,并允许您近乎实时地播放录制的音频(它会有延迟;多少取决于您的硬件和所涉及的所有缓冲区的大小)。 / p>