Comment joindre deux ou plusieurs fichiers .WAV ensemble par programme?

J’ai besoin de la possibilité de joindre deux ou plusieurs fichiers .wav dans un fichier .wav. Je dois le faire par programme, en utilisant C # (les produits tiers ne sont pas une option). Je connais la classe System.Media.SoundPlayer, mais je ne cherche pas à lire le fichier .wav, mais seulement à le créer.

Voici une fonction de concaténation WAV de base créée à l’aide de NAudio . Cela garantira que seuls les fragments de données sont concaténés (contrairement à l’exemple de code de cet article CodeProject lié dans une autre réponse). Cela vous évitera également de concaténer des fichiers WAV ne partageant pas le même format.

public static void Concatenate(ssortingng outputFile, IEnumerable sourceFiles) { byte[] buffer = new byte[1024]; WaveFileWriter waveFileWriter = null; try { foreach (ssortingng 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(); } } } 

Un commentaire sur la réponse de Mark:

L’opérateur == ne semble pas fonctionner pour moi lors de la comparaison de formats d’ondes. C’est plus sûr de faire ceci:

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

Alternativement, vous pouvez envelopper le lecteur dans un stream WaveFormatConversionStream et vous débarrasser complètement de la vérification du format (vous ne savez pas si cela fonctionnera dans tous les scénarios, mais j’ai pu le tester avec succès).

Regardez cet exemple de codeprojet, semble être exactement ce dont vous avez besoin avec une bonne explication de la façon de le faire aussi:

Concaténation de fichiers Wave à l’aide de C # 2005

Il semble qu’il s’agisse essentiellement d’extraire et de fusionner les données audio de tous les fichiers wav en un bloc de données avec un nouvel en-tête de fichier au-dessus.

EDIT: Je n’ai aucune expérience de l’utilisation de cela, ni je suis un expert. Je viens de tomber sur cet article et je pensais que cela pourrait être utile. Voir la réponse de Mark Heath pour une meilleure solution

Utiliser depuis Comment joindre des fichiers .Wav ensemble

  private void JoinWav() { ssortingng[] files = new ssortingng[] { "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); }