2

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 格式,并且应该能够播放可用的持续时间。只要有更多内容可用,就更新目标文件。

我用静态 WAV 文件尝试了以下示例代码(使用 NAudio),但解决方案不起作用。

  1. 生成的 WAV 文件已损坏 - 格式不正确。

    using (WaveFileReader reader = new WaveFileReader(remoteWavFile))
    {
      byte[] buffer = new byte[reader.Length];
      int read = reader.Read(buffer, 0, buffer.Length);           
    }
    
  2. 当录制正在进行时,代码会抛出异常“文件正在被另一个应用程序使用”。

4

1 回答 1

0

我在 NAudio Library 本身的帮助下解决了这个问题。

  1. 当我们只使用 NAudio 的 WaveFileReader 类时。它将抛出异常 - “文件正在被另一个应用程序使用”。所以我必须创建一个文件流,它打开源文件 - 实时录制文件,File.Open(inPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)然后将此流作为 WaveFileReader 的输入传递。

  2. 然后创建一个 NAudio 的 WaveFileWritter 类,与WavFormatreader 相同。

下面复制的是我用过的代码。

   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);
                        }
                    }
                }
            }         
        }           
    }
于 2016-01-25T12:47:42.513 回答