Como juntar 2 ou mais arquivos .WAV juntos programaticamente?

Eu preciso da capacidade de juntar 2 ou mais arquivos .wav juntos em um arquivo .wav. Eu devo fazer isso programaticamente, usando C # (produtos de terceiros não são uma opção). Eu sei da class System.Media.SoundPlayer, mas não estou olhando para reproduzir o .wav, mas apenas para criá-lo.

Aqui está uma function básica de concatenação WAV construída usando o NAudio . Isso garantirá que apenas os blocos de dados sejam concatenados (diferentemente do exemplo de código neste artigo CodeProject vinculado em outra resposta). Ele também irá protegê-lo contra a concatenação de arquivos WAV que não compartilham o mesmo formato.

public static void Concatenate(string outputFile, IEnumerable sourceFiles) { byte[] buffer = new byte[1024]; WaveFileWriter waveFileWriter = null; try { foreach (string sourceFile in sourceFiles) { using (WaveFileReader reader = new WaveFileReader(sourceFile)) { if (waveFileWriter == null) { // first time in create new Writer waveFileWriter = new WaveFileWriter(outputFile, reader.WaveFormat); } else { if (!reader.WaveFormat.Equals(waveFileWriter.WaveFormat)) { throw new InvalidOperationException("Can't concatenate WAV Files that don't share the same format"); } } int read; while ((read = reader.Read(buffer, 0, buffer.Length)) > 0) { waveFileWriter.WriteData(buffer, 0, read); } } } } finally { if (waveFileWriter != null) { waveFileWriter.Dispose(); } } } 

Um comentário sobre a resposta de Mark:

O operador == não parece funcionar para mim ao comparar formatos de onda. É mais seguro fazer isso:

 if (!reader.WaveFormat.Equals(waveFileWriter.WaveFormat)) 

Alternativamente, você poderia envolver o leitor em um WaveFormatConversionStream e se livrar completamente da verificação de formato (não tenho certeza se ele funcionará em todos os cenários, mas eu pude testá-lo com sucesso).

Confira este exemplo de projeto de código, parece ser exatamente o que você precisa com uma boa explicação de como fazer isso também:

Concatenando Arquivos Wave Usando o C # 2005

Parece compreender essencialmente a extração e fusão dos dados de som de todos os arquivos wav em um bloco de dados com um novo header de arquivo no topo.

EDIT: Eu não tenho experiência de usar isso, nem sou um especialista. Acabei de me deparar com este artigo e pensei que poderia ser útil. Veja a resposta de Mark Heath para uma solução melhor

Use de Como ingressar em arquivos .Wav juntos

  private void JoinWav() { string[] files = new string[] { "1990764-ENG-CONSEC-RESPONSE7.WAV","1990764-ND_A.WAV", "1990764-SIGHT-SP.WAV", "1990764-SP-CONSEC-RESPONSE6.WAV","1990764-VOCABWORD-004-12-SP.WAV","bi-consec-1-successful.wav", "bi-transition-instruct.wav","nd_B.wav","sightreceived_B.wav","teststamp_A.wav" }; AudioCompressionManager.Join("res.wav", files); }