2014-12-17 7 views
0

WaveIn p/invoke를 포기한 후 NAudio 1.7을 사용하고 있습니다 ... 어쨌든 VoIP 응용 프로그램을 만들고 샘플 코드에서 WaveFileWriter를 사용하여 디스크로 출력했는데 필요 없기 때문에 대신 memoryStream 오버로드를 사용했습니다.Naudio 녹음 및 재생 오디오

SoundPlayer 클래스로 녹음을 중지 한 후 스트림을 재생하려고하면 문제가 발생합니다. 단지 재생되지 않고 코드가 계속되지만 아래에 표시된대로 저장하면 VLC에서 재생할 수 있습니다. ,하지만 파일 자체에서로드하려고하면 "Wav 헤더가 손상된"던지거나 이번에도 재생되지 않습니다.이 경우에도 Position 0으로 설정하지 않으면 스트림에서 throw됩니다.

저장시 Windows에서 wav 파일 헤더 자체를 설정합니까? VLC로 재생할 수있는 이유는 무엇입니까? SoundPlayer는 저장할 수 없습니다.

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 

답변

1

나는이 C#을 알고하지만 난 당신이 아이디어를 얻을 생각) 난 당신이 그랬던 것처럼 동일한 작업을 수행하려고이 나를 위해 작동합니다.

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(); 
} 

}