2015-05-07 2 views
2

Я пытался разработать диктофон в C#. Я пробовал много способов, таких как NAudio, DirectX, Microsoft.Xna.Framework.Audio и т. Д.Запись звука в реальном времени с входа микрофона и одновременного сохранения

Все дает тот же результат. После остановки записи выходной файл mp3/wav будет сохранен.

MP3/WAV файл получить создан в самом начале (без и содержания - 0 байт)

Я пытаюсь создать приложение, которое может сохранить аудио вживую/одновременно.

private void StartRecording() { 
     this.WaveSource = new WaveInEvent { WaveFormat = new WaveFormat(44100, 1) }; 

     this.WaveSource.DataAvailable += this.WaveSourceDataAvailable; 
     this.WaveSource.RecordingStopped += this.WaveSourceRecordingStopped; 

     this.WaveFile = new WaveFileWriter(@"C:\Sample.wav", this.WaveSource.WaveFormat); 

     this.WaveSource.StartRecording(); 
    } 

    private void StopRecording() { 
     this.WaveSource.StopRecording(); 
    } 

    void WaveSourceDataAvailable(object sender, WaveInEventArgs e) { 
     if (this.WaveFile != null) { 
      this.WaveFile.Write(e.Buffer, 0, e.BytesRecorded); 
      this.WaveFile.Flush(); 
     } 
    } 

    void WaveSourceRecordingStopped(object sender, StoppedEventArgs e) { 
     if (this.WaveSource != null) { 
      this.WaveSource.Dispose(); 
      this.WaveSource = null; 
     } 

     if (this.WaveFile != null) { 
      this.WaveFile.Dispose(); 
      this.WaveFile = null; 
     } 
    } 

ответ

1

Я решил проблему с самой библиотекой NAudio. Немного модификации существующего кода.

public class Recorder { 

    WaveIn sourceStream; 
    WaveFileWriter waveWriter; 
    readonly String FilePath; 
    readonly String FileName; 
    readonly int InputDeviceIndex; 

    public Recorder(int inputDeviceIndex, String filePath, String fileName) { 
     InitializeComponent(); 
     this.InputDeviceIndex = inputDeviceIndex; 
     this.FileName = fileName; 
     this.FilePath = filePath; 
    } 

    public void StartRecording(object sender, EventArgs e) { 
     sourceStream = new WaveIn { 
      DeviceNumber = this.InputDeviceIndex, 
      WaveFormat = 
       new WaveFormat(44100, WaveIn.GetCapabilities(this.InputDeviceIndex).Channels) 
     }; 

     sourceStream.DataAvailable += this.SourceStreamDataAvailable; 

     if (!Directory.Exists(FilePath)) { 
      Directory.CreateDirectory(FilePath); 
     } 

     waveWriter = new WaveFileWriter(FilePath + FileName, sourceStream.WaveFormat); 
     sourceStream.StartRecording(); 
    } 

    public void SourceStreamDataAvailable(object sender, WaveInEventArgs e) { 
     if (waveWriter == null) return; 
     waveWriter.Write(e.Buffer, 0, e.BytesRecorded); 
     waveWriter.Flush(); 
    } 

    private void RecordEnd(object sender, EventArgs e) { 
     if (sourceStream != null) { 
      sourceStream.StopRecording(); 
      sourceStream.Dispose(); 
      sourceStream = null; 
     } 
     if (this.waveWriter == null) { 
      return; 
     } 
     this.waveWriter.Dispose(); 
     this.waveWriter = null; 
     recordEndButton.Enabled = false; 
     Application.Exit(); 
     Environment.Exit(0); 
    } 
} 
+0

Можем ли мы получить звуковые колонки также? – Ahmad

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