2016-01-22 75 views
1

我有一個使用NAudio庫的WAV格式的活動錄音。將活動錄製的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 Library本身的幫助解決了這個問題。

  1. 當我們只使用NAudio的WaveFileReader類。它會拋出異常 - 「文件正在被另一個應用程序使用」。 所以我不得不創建一個文件流,它打開源文件 - 現場錄製文件,然後將File.Open(inPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)作爲WaveFileReader的輸入。

  2. 然後創建一個NAudio的WaveFileWritter類,其中包含與讀取器相同的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); 
         } 
        } 
       } 
      }   
     }   
    } 
相關問題