2016-01-22 9 views
1

У меня есть активная запись звука в формате WAV с помощью библиотеки NAudio.Копирование и обновление содержимого активной записи файла Wav в новый файл

private void RecordStart() { 
     try { 
      _sourceStream = new WaveIn { 
       DeviceNumber = _recordingInstance.InputDeviceIndex, 
       WaveFormat = 
        new WaveFormat(
        44100, 
        WaveIn.GetCapabilities(_recordingInstance.InputDeviceIndex).Channels) 
      }; 

      _sourceStream.DataAvailable += SourceStreamDataAvailable; 
      if (!Directory.Exists(_recordingInstance.AudioFilePath)) { 
       Directory.CreateDirectory(_recordingInstance.AudioFilePath); 
      } 

      WaveFileWriter _waveWriter = new WaveFileWriter(
       _recordingInstance.AudioFilePath + _recordingInstance.AudioFileName, 
       _sourceStream.WaveFormat); 
      _sourceStream.StartRecording(); 
     } 
     catch (Exception exception) { 
      Log.Error("Recording failes", exception); 
     } 
    } 

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

Я хочу скопировать последний доступный контент в другое место. Скопированный файл должен быть в формате WAV и должен иметь возможность воспроизводить доступную продолжительность. Обновляйте файл назначения, когда доступно больше контента.

Я пробовал следующий пример кода (используя NAudio) со статическим WAV-файлом, но решение не работает.

  1. Созданный WAV-файл поврежден - не в правильном формате.

    using (WaveFileReader reader = new WaveFileReader(remoteWavFile)) 
    { 
        byte[] buffer = new byte[reader.Length]; 
        int read = reader.Read(buffer, 0, buffer.Length);   
    } 
    
  2. Когда запись выполняется, код генерирует исключение «Файл используется другим приложением».

+0

Что значит «решение не работает»? Скомпилирует ли он? Вызывает ли это исключение? Это шлепает вашу собаку? Пожалуйста, опишите проблему более подробно. – Corey

+0

Я пытался прочитать содержимое в буфер, а затем создать новый файл, используя массив байтов. Он скопировал содержимое и создал WAV-файл. Но не удается воспроизвести файл. – Sarin

+0

Итак, ваш второй блок кода показывает вам чтение данных из волнового файла, но он ничего не делает с этими данными. Где раздел записи? – Corey

ответ

0

Я решил проблему с помощью самой библиотеки NAudio.

  1. Когда мы используем только класс WaveFileReader для NAudio. Он будет генерировать исключение - «файл используется другим приложением». Итак, мне пришлось создать поток файлов, который открывает исходный файл - живой файл записи, с File.Open(inPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), затем передайте этот поток в качестве входа WaveFileReader.

  2. Затем создайте класс WaveFileWritter для NAudio с тем же WavFormat читателя.

Скопировано ниже - это код, который я использовал.

public static void CopyWavFile(string inPath, string outPath){ 
     using (var fs = File.Open(inPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){ 
      using (var reader = new WaveFileReader(fs)){ 
       using (var writer = new WaveFileWriter(outPath, reader.WaveFormat)){ 
        reader.Position = 0; 
        var endPos = (int)reader.Length;       
        var buffer = new byte[1024]; 
        while (reader.Position < endPos){ 
         var bytesRequired = (int)(endPos - reader.Position); 
         if (bytesRequired <= 0) continue; 
         var bytesToRead = Math.Min(bytesRequired, buffer.Length); 
         var bytesRead = reader.Read(buffer, 0, bytesToRead); 
         if (bytesRead > 0){ 
          writer.Write(buffer, 0, bytesRead); 
         } 
        } 
       } 
      }   
     }   
    }