2013-07-08 62 views
1

我有这个代码在这里:n音讯录音

NAudio.Wave.WaveIn sourceStream = null; 
    NAudio.Wave.DirectSoundOut waveOut = null; 
    NAudio.Wave.WaveFileWriter waveWriter = null; 
     private void button3_Click(object sender, RoutedEventArgs e) // Start 
    { 
     ShowImage(); 

     sourceStream = new NAudio.Wave.WaveIn(); 
     sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, 2); 

     NAudio.Wave.WaveInProvider waveIn = new NAudio.Wave.WaveInProvider(sourceStream); 

     waveOut = new NAudio.Wave.DirectSoundOut(); 
     waveOut.Init(waveIn); 

     sourceStream.StartRecording(); 
    } 

    private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e) 
    { 
     if (waveWriter == null) return; 

     waveWriter.WriteData(e.Buffer, 0, e.BytesRecorded); 
     waveWriter.Flush(); 
    } 

    private void btnStop_Click(object sender, RoutedEventArgs e) 
    { 
     if (waveOut != null) 
     { 
      waveOut.Stop(); 
      waveOut.Dispose(); 
      waveOut = null; 
     } 
     if (sourceStream != null) 
     { 
      sourceStream.StopRecording(); 
      sourceStream.Dispose(); 
      sourceStream = null; 
     } 
     if (waveWriter != null) 
     { 
      waveWriter.Dispose(); 
      waveWriter = null; 
     } 

     sourceStream = new NAudio.Wave.WaveIn(); 
     sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, 2); 
     sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable); 
     waveWriter = new NAudio.Wave.WaveFileWriter(@"../../StoryImages/", sourceStream.WaveFormat); 

     sourceStream.StopRecording(); 
    } 

我在做正确吗?我看过教程并尝试过,但是在编程方面我真的很虚弱,这与缓冲区的问题似乎让我的整个应用程序崩溃。它总是说缓冲区已满。 Theres有问题

WriteData(e.Buffer,0,e.BytesRecorded);

我使用n音讯为此在WPF中,我使用Visual Studio 2010中

回答

0

也许我missunderstand你,但你发布的代码似乎有点非结构化。 在您用button3_Click开始录制时,WaveWriter仍为空。为什么不在button3_click中创建此作者的实例?

总的来说,我会建议你排序你的对象的创建和处置。 - > Start方法应包含所有对象的创建,以及添加“+ =”事件处理程序。 停止按钮处理程序应包含所有关闭的流,并释放资源。

+0

新naudio,因为我假设它有一些可用的数据(当开始录制时),然后它开始写 – user2376998

+0

所以如果你开始你的应用程序只有按下按钮“开始”会发生什么。 ? – Tintenfiisch

+0

它假设开始记录和显示图像,但它倾向于在几秒钟后出现此缓冲区已满的错误消息 – user2376998

0

我认为这里的问题是缓冲区永远不会被清空。 您缺少waveOut.Play();之后sourceStream.StartRecording();使缓冲器正确流向扬声器。

此外,您不能清空sourceStream_DataAvailable回调中的缓冲区direclty,因为它是只读的。

如果你不想音频播放,你将需要另一个接收器,然后DirectSoundOut。