c# - 使用 naudio 录制后,无效的 wav 文件未找到 fmt block

标签 c# .net audio audio-recording naudio

我的动机是使用 NAudio 录制音频,保存为 wav 文件,然后混合多个音频并播放。为此我尝试了

  private void buttonRecord_Click(object sender, EventArgs e)
    {
        //if (sourceList.SelectedItems.Count == 0) return;

        //int deviceNumber = sourceList.SelectedItems[0].Index;

        sourceStream = new NAudio.Wave.WaveIn();
        sourceStream.DeviceNumber = 0;
        sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(0).Channels);

        sourceStream1 = new NAudio.Wave.WaveIn();
        sourceStream1.DeviceNumber = 1;
        sourceStream1.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(1).Channels);

        //NAudio.Wave.WaveInProvider waveIn = new NAudio.Wave.WaveInProvider(sourceStream);



        //sourceStream.StartRecording();
        //waveOut.Play();


        sourceStream1.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(waveIn_DataAvailable1);
        writer1 = new NAudio.Wave.WaveFileWriter("D:\test.wav", sourceStream1.WaveFormat);
        sourceStream1.StartRecording();  

        sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>( waveIn_DataAvailable);
        writer = new NAudio.Wave.WaveFileWriter("D:\test1.wav", sourceStream.WaveFormat);
        sourceStream.StartRecording();  
    }
    void waveIn_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
    {
        writer.WriteData(e.Buffer, 0, e.BytesRecorded);
    }
    void waveIn_DataAvailable1(object sender, NAudio.Wave.WaveInEventArgs e)
    {
        writer1.WriteData(e.Buffer, 0, e.BytesRecorded);
    }
    private void buttonStopRecording_Click(object sender, EventArgs e)
    {

        if (sourceStream != null)
        {
            sourceStream.StopRecording();
            sourceStream.Dispose();
            sourceStream = null;
        }
        if (sourceStream1 != null)
        {
            sourceStream1.StopRecording();
            sourceStream1.Dispose();
            sourceStream1 = null;
        }
    }

以上代码非常适合录制,但录制的音频不能在 Windows 媒体播放器中播放,但可以与 VLC 媒体播放器一起使用。使用下面的代码我尝试混合

   void Mixingfunction()
    {
       MixingSampleProvider mixer = new MixingSampleProvider(NAudio.Wave.WaveFormat.CreateIeeeFloatWaveFormat(44100, 1));
        try
        {


            audioFileReader = new AudioFileReader(@"D:\test1.wav");
                mixer.AddMixerInput((ISampleProvider)audioFileReader);
                audioFileReader = new AudioFileReader(@"D:\test.wav");
                mixer.AddMixerInput((ISampleProvider)audioFileReader);
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
            return;

        }
        waveOut = new NAudio.Wave.DirectSoundOut();

        //if (flag == true)
        //{
        //    mixer.AddMixerInput((ISampleProvider)sineWaveProvider);
        //}
        //SampleToWaveProvider mixer2 = new SampleToWaveProvider((ISampleProvider)mixer);
        waveOut.Init((IWaveProvider)mixer);
        waveOut.Play();
    }

但它给出了异常no FMT Chunk found。现在我不知道该怎么做....

最佳答案

您需要在准备好播放之前处理您的 WaveFileWriter 对象。这样做会更新 WAV 文件头中的 block 大小。

关于c# - 使用 naudio 录制后,无效的 wav 文件未找到 fmt block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38523255/

相关文章:

c# - IOrderedEnumerable 的 LINQ 优化

iPhone:如何检测 iTunes 是否正在播放?

audio - Spotify 使用什么音频格式以及他们如何将文件传输到移动设备?

c# - Entity Framework 在运行时将模型类映射到表

c# - DataGridView:如何使某些单元格不可选择?

c# - 在 C# 中反序列化 XML - 格式错误时返回 null

c# - Azure Function 函数如何使用托管标识获取对 Azure 表存储的引用?

.net - 将描边应用于 WPF 中的文本 block

c# - 具有多个基本构造函数和事件的 F# 继承

javascript - 顺序播放音频文件不起作用