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 ライブラリ自体の助けを借りて問題を解決しました。

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