C# 将多个wav格式的文件拼接(合并)成一个文件
1、nuget安装NAudio

2、代码实现
using NAudio.Wave; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace SoundWin.Common { public class WavFileMerger { /// <summary> /// // 输入的 WAV 文件路径列表(确保格式一致) //var inputFiles = new List<string> //{ // @"C:\audio\part1.wav", // @"C:\audio\part2.wav", // @"C:\audio\part3.wav" //}; //string outputFile = @"C:\audio\output.wav"; //ConcatenateWavFiles(inputFiles, outputFile); /// </summary> /// <param name="inputFiles"></param> /// <param name="outputFile"></param> /// <exception cref="ArgumentException"></exception> /// <exception cref="FileNotFoundException"></exception> /// <exception cref="InvalidOperationException"></exception> public static bool ConcatenateWavFiles(List<string> inputFiles, string outputFile,ref string error) { try { if (inputFiles == null || inputFiles.Count == 0) { error = "至少需要一个输入文件"; return false; } // 检查所有文件是否存在 foreach (var file in inputFiles) { if (!File.Exists(file)) { error = $"找不到音频文件: {file}"; return false; } } WaveFormat format; using (var firstReader = new WaveFileReader(inputFiles[0])) { format = firstReader.WaveFormat; } using (var writer = new WaveFileWriter(outputFile, format)) { foreach (var inputFile in inputFiles) { using (var reader = new WaveFileReader(inputFile)) { // 第一个文件:设置输出格式 if (format == null) { format = reader.WaveFormat; } else { // 检查格式是否一致 if (!WaveFormat.Equals(format, reader.WaveFormat)) { error = $"文件 {inputFile} 的音频格式与其他文件不一致。" + $"需要与第一个文件 {inputFiles[0]} 的格式相同。"; return false; } } // 读取并写入音频数据 var buffer = new byte[reader.WaveFormat.AverageBytesPerSecond * 1]; // 1秒缓冲区 int bytesRead; while ((bytesRead = reader.Read(buffer, 0, buffer.Length)) > 0) { writer.Write(buffer, 0, bytesRead); } } } } return true; } catch(Exception ex) { error = "异常"; LogHelper.Error("合成音频异常:" + ex.ToString()); return false; } } /// <summary> /// 倍速 /// </summary> /// <param name="inputFiles"></param> /// <param name="outputFile"></param> /// <param name="speedFactor">几倍速度</param> public static void ConcatenateAndSpeedUpWavFiles(List<string> inputFiles, string outputFile,double speedFactor = 2.0) { WaveFormat format; using (var firstReader = new WaveFileReader(inputFiles[0])) { format = firstReader.WaveFormat; } using (var outputWriter = new WaveFileWriter(outputFile, format)) { foreach (var inputFile in inputFiles) { using (var reader = new AudioFileReader(inputFile)) { // 创建 2 倍速的重采样器(通过提高采样率实现) // 原始采样率 * 2 → 播放时长减半(但音调变高) //var speedFactor = 2.0; var newSampleRate = (int)(reader.WaveFormat.SampleRate * speedFactor); // 使用 MediaFoundationResampler(Windows 平台可用) using (var resampler = new MediaFoundationResampler(reader, new WaveFormat(newSampleRate, reader.WaveFormat.Channels))) { resampler.ResamplerQuality = 60; // 质量 0-60,越高越好 // 读取并写入加速后的数据 byte[] buffer = new byte[reader.WaveFormat.AverageBytesPerSecond * 2]; // 2秒缓冲 int bytesRead; while ((bytesRead = resampler.Read(buffer, 0, buffer.Length)) > 0) { outputWriter.Write(buffer, 0, bytesRead); } } } } } } } }

浙公网安备 33010602011771号