编辑
2025-11-22
C#
00

目录

准备工作
完整代码实现
使用示例
注意事项
总结

本文将介绍如何使用C#和Xabe.FFmpeg库来实现音频文件的合并功能。我们将创建一个功能完整的音频合并器,支持进度显示和质量控制。

准备工作

首先需要安装必要的NuGet包:

PowerShell
Install-Package Xabe.FFmpeg

image.png

下载FFmpeg可执行文件,可以从FFmpeg官网下载。

HTML
https://ffmpeg.org/download.html

完整代码实现

C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Xabe.FFmpeg; namespace App05 { public class AudioMerger { public enum AudioQuality { Low, Medium, High, VeryHigh } public async Task MergeAudioFilesAsync( List<string> inputFiles, string outputFile, AudioQuality quality = AudioQuality.Medium, IProgress<double> progress = null) { // 设置FFmpeg可执行文件路径 FFmpeg.SetExecutablesPath("D:\\Software\\ffmpeg-master-latest-win64-gpl-shared\\bin"); // 获取音频总时长用于进度显示 double totalDuration = 0; foreach (var file in inputFiles) { var mediaInfo = await FFmpeg.GetMediaInfo(file); totalDuration += mediaInfo.Duration.TotalSeconds; } // 根据质量等级设置比特率 var audioBitrate = GetAudioBitrate(quality); // 创建concat文件 string listFilePath = "concat.txt"; using (StreamWriter writer = new StreamWriter(listFilePath)) { foreach (var file in inputFiles) { // 使用转义的路径 writer.WriteLine($"file '{file.Replace("\\", "\\\\")}'"); } } try { var conversion = FFmpeg.Conversions.New() .AddParameter($"-f concat -safe 0 -i \"{listFilePath}\"") .AddParameter($"-c:a libmp3lame") // 改用 MP3 编码器 .AddParameter($"-b:a {audioBitrate}k") // 音频比特率 .AddParameter("-threads 0") // 使用所有可用线程 .SetOutput(outputFile) .SetOverwriteOutput(true); // 添加进度报告 conversion.OnProgress += (sender, args) => { if (totalDuration > 0) { var progressValue = (args.Duration.TotalSeconds / totalDuration) * 100; progress?.Report(Math.Min(progressValue, 100)); } }; await conversion.Start(); } finally { if (File.Exists(listFilePath)) { File.Delete(listFilePath); } } } private int GetAudioBitrate(AudioQuality quality) { return quality switch { AudioQuality.Low => 96, AudioQuality.Medium => 192, AudioQuality.High => 256, AudioQuality.VeryHigh => 320, _ => 192 }; } } }

使用示例

C#
namespace App05 { internal class Program { static async Task Main(string[] args) { var audioMerger = new AudioMerger(); var inputFiles = new List<string> { @"D:\Video\m1.mp3", @"D:\Video\m2.mp3", @"D:\Video\m3.mp3" }; var progress = new Progress<double>(percent => { Console.WriteLine($"合并进度: {percent:F2}%"); }); try { await audioMerger.MergeAudioFilesAsync( inputFiles, @"d:\merged_output.mp3", AudioMerger.AudioQuality.High, progress ); Console.WriteLine("音频合并完成!"); } catch (Exception ex) { Console.WriteLine($"合并过程中出现错误: {ex.Message}"); } } } }

image.png

注意事项

  1. 使用前需要正确设置FFmpeg可执行文件路径
  2. 输入文件路径中不能包含单引号
  3. 确保有足够的磁盘空间
  4. 所有输入文件应该是相同格式的音频文件
  5. 建议在合并大文件时使用进度显示功能
  6. 使用 -threads 0 参数充分利用多核CPU

总结

这个音频合并器提供了一个全面的解决方案,它支持多文件合并、质量控制、进度显示、异常处理以及临时文件清理等功能。此外,根据实际需求,该工具还可以进一步扩展,例如增加音频格式转换和音频剪辑等实用特性。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!