C# 将多个wav格式的文件拼接(合并)成一个文件

1、nuget安装NAudio

image

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


    }
}
View Code

 

posted @ 2025-11-12 10:58  ziff123  阅读(6)  评论(0)    收藏  举报