本文将介绍如何使用C#和Xabe.FFmpeg库来实现音频文件的合并功能。我们将创建一个功能完整的音频合并器,支持进度显示和质量控制。
首先需要安装必要的NuGet包:
PowerShellInstall-Package Xabe.FFmpeg

下载FFmpeg可执行文件,可以从FFmpeg官网下载。
HTMLhttps://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}");
}
}
}
}

-threads 0 参数充分利用多核CPU这个音频合并器提供了一个全面的解决方案,它支持多文件合并、质量控制、进度显示、异常处理以及临时文件清理等功能。此外,根据实际需求,该工具还可以进一步扩展,例如增加音频格式转换和音频剪辑等实用特性。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!