Hot Cool Stud
Hot Cool Stud

Reputation: 1205

Invalid wav file no fmt chunk found after recording using naudio

My motive is to record audio using NAudio, save as wav file and then mix multiple audios and play. For this i tried

  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;
        }
    }

Above codes works perfect for recording but recorded audios are not playing in windows media player but works with VLC media player. Using code below i tried mixing

   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();
    }

But it gives exception no FMT Chunk found. Now i don't know to do....

Upvotes: 1

Views: 2270

Answers (1)

Mark Heath
Mark Heath

Reputation: 49482

You need to dispose your WaveFileWriter objects before they are ready to be played. Doing so will update the chunk sizes in the WAV file header.

Upvotes: 5

Related Questions