2016-07-22 8 views
0

Моим мотивом является запись звука с использованием NAudio, сохранение в виде wav-файла, а затем смешивание нескольких аудиофайлов и воспроизведение. Для этого я попыталсяНедопустимый wav-файл no fmt chunk найден после записи с использованием naudio

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 Media Player, но работает с 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. Теперь я не знаю, что делать ....

ответ

2

Перед тем, как они будут готовы к игре, вам необходимо разместить объекты WaveFileWriter. Это позволит обновить размеры блоков в заголовке файла WAV.

+0

И, наконец, отметьте, что я ждал ответа с вашей стороны, разместил много вопросов с тегом Naudio. Теперь звук записывается успешно, но когда я пытаюсь смешивать аудио, используя mixsampleprovider, он дает исключение «Все входы микшера должны иметь один и тот же WaveFormat». Зачем? , Я попытался найти учебник по микшированию звука, но получил только ключ к одному ответу на stackoverflow от вас, чтобы использовать mixsampleprovider. –

+0

Спасибо, что из-за вашего naudio моя задача решена .... –