2014-12-17 2 views
0

Я использую NAudio 1.7 после того, как я отказался от WaveIn p/invoke ... во всяком случае, я делаю приложение VoIP, а пример кода, который я нашел, использовал WaveFileWriter для вывода на диск, Не хочу этого, поэтому вместо этого я использовал перегрузку memoryStream.Naudio Запись и воспроизведение звука

Проблема заключается в том, что я пытаюсь воспроизвести поток после того, как прекратил запись с помощью класса SoundPlayer, он просто не воспроизводит и продолжает код, но если я сохраню его, как показано ниже, я могу воспроизвести его в VLC , но если я попытаюсь загрузить его из самого файла, он тоже не воспроизводится, на этот раз, когда «поврежден Wav-заголовок» или что-то еще, это вызывает поток, если я не устанавливаю его также в позицию 0.

Устанавливает ли 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(); 
} 

}

Смежные вопросы