Naudio录制和播放音频 [英] Naudio Recording and playing audio

查看:513
本文介绍了Naudio录制和播放音频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在放弃WaveIn p/invoke后,我正在使用NAudio 1.7 ...无论如何,我正在制作VoIP应用程序,而我发现的示例代码使用WaveFileWriter输出到磁盘,我不希望这样做,所以我改用了memoryStream重载.

I'm using NAudio 1.7 after i gave up on WaveIn p/invoke... anyway, i'm making a VoIP application and the sample code i found used WaveFileWriter to output to disk, i don't want that, so i used the memoryStream overload instead.

问题是当我停止使用SoundPlayer类的录制后尝试播放流时,它只是不播放并继续执行代码,但是如果我按如下所示保存它,则可以在VLC中播放它,但是,如果我尝试从文件本身加载它,它也不会播放,这一次抛出"Wav标头损坏"之类的东西,如果我也未将其设置为位置0,则会抛出该流.

The problem is when i try to play the stream after i stop the recording with the SoundPlayer class, it just doesn't play and continues the code, but if i save it as shown below, i can play it in VLC, but if i try to load it from the file itself, it doesn't play either, this time throwing "Wav header damaged" or something, this throws in the stream if i don't set it to Position 0 too.

在保存时,Windows会自行设置wav文件头吗?为什么VLC可以播放它,而即使我保存,SoundPlayer也无法播放?

Do windows sets the wav file header itself when i save it? Why can VLC play it and SoundPlayer can't even if i save it?

   Private waveFile As WaveFileWriter
Private newWave As New NAudio.Wave.WaveIn

Private memstream As New MemoryStream

Public Sub StartRecording()
    newWave.WaveFormat = New WaveFormat(44100, 1)

    waveFile = New WaveFileWriter(memstream, newWave.WaveFormat)

    AddHandler newWave.DataAvailable, AddressOf RecordedDataAvailable
    AddHandler newWave.RecordingStopped, AddressOf RecordingStopped

    newWave.StartRecording()
End Sub

Private Sub RecordedDataAvailable(sender As Object, e As NAudio.Wave.WaveInEventArgs)
    If waveFile IsNot Nothing Then
        waveFile.Write(e.Buffer, 0, e.BytesRecorded)
        waveFile.Flush()
    End If
End Sub

Private Sub RecordingStopped(sender As Object, e As NAudio.Wave.StoppedEventArgs)
    Dim fileName As String = Application.StartupPath & "\Test"

    File.WriteAllBytes(fileName & ".wav", memstream.GetBuffer)

    memstream.Position = 0

    Dim player As New SoundPlayer(memstream)
    player.Play()
End Sub

推荐答案

我知道这是C#,但我认为您明白了;) 我尝试过与您一样,这对我有用.

I know this is C# but I think you get the idea ;) I tried to do same as you did and this works for me.

private WaveFileWriter writer;
private WaveIn waveIn;
private MemoryStream memoryStream;

public MainWindow()
{
  InitializeComponent();

  waveIn = new WaveIn();

  waveIn.DataAvailable += OnWaveInDataAvailable;
  waveIn.RecordingStopped += OnWaveInRecordingStopped;
}

private void OnWaveInDataAvailable(object sender, WaveInEventArgs waveInEventArgs)
{
  writer.Write(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded);
  writer.Flush();
}

private void OnWaveInRecordingStopped(object sender, StoppedEventArgs stoppedEventArgs)
{
  Save();
}

private void Start()
{
  memoryStream = new MemoryStream();
  writer = new WaveFileWriter(new IgnoreDisposeStream(memoryStream), waveIn.WaveFormat);
  waveIn.StartRecording();
}

private void Stop()
{
  waveIn.StopRecording();
}

private void Save()
{
  using (var fileStream = File.Create("test.wav"))
  {
    memoryStream.Seek(0, SeekOrigin.Begin);
    memoryStream.CopyTo(fileStream);
  }
}

private void Play()
{
  var soundPlayer = new SoundPlayer(memoryStream);
  memoryStream.Seek(0, SeekOrigin.Begin);
  soundPlayer.Play();
}

private void OnRecordClick(object sender, RoutedEventArgs e)
{
  Start();
}

private void OnStopClick(object sender, RoutedEventArgs e)
{
  Stop();
}

private void OnPlayClick(object sender, RoutedEventArgs e)
{
  Play();
}

}

这篇关于Naudio录制和播放音频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆