
音视频音频处理【免费下载链接】NAudioAudio and MIDI library for .NET项目地址https://gitcode.com/gh_mirrors/na/NAudio点击查看免费下载重采样Resampling是音频处理中最常见的需求之一混音前要把不同采样率的文件统一ASIO 等设备输出前要把数据转换到设备当前的采样率。本文以 NAudio 仓库中的 Docs/Resampling.md 为骨架系统讲解 NAudio 提供的四种重采样方案Windows 的 Media Foundation、macOS 的 AudioConverter、跨平台的 WDL、遗留的 ACM逐一给出可直接复制的代码示例、参数取值范围与质量档位说明并结合仓库源码MediaFoundationResampler.cs、MacAudioConverter.cs、WdlResamplingSampleProvider.cs 等解释每种方案的底层工作原理、适用平台与限制。读完本文你将能够在混音、设备播放、文件转码等场景中准确选择并正确使用 NAudio 的重采样器。什么时候需要重采样在 NAudio 中几乎所有下游处理环节都对 WaveFormat采样率、位深度、声道数有严格要求因此重采样通常出现在以下两类场景混音前的统一采样率将两个采样率不同的文件例如一个 44.1kHz、一个 48kHz混合到一起必须先通过重采样让它们处于同一采样率否则混音结果会出现音高与节奏错位。设备输出前的格式匹配通过 ASIO 这类 API 播放时数据必须以设备当前的采样率送入设备。若源文件采样率与设备不匹配就必须先重采样。需要注意的是重采样并非简单的插值补点它暗藏一个经典陷阱——混叠Aliasing。重采样前必须了解混叠Aliasing问题根据奈奎斯特定理某采样率能正确表示的频率上限为采样率的一半。当降低采样率时源音频中高于目标采样率一半的高频成分无法被正确表示它们不会消失而是会折叠回可听频段形成失真这就是混叠。文档给出的核心结论是如果降低采样率应当先使用低通滤波器滤除在低采样率下无法正确表示的高频然后再做重采样。好消息是NAudio 提供的几个官方重采样器Media Foundation、AudioConverter、WDL内部都内置了高质量的滤波/抗混叠处理因此日常使用时你通常无需手动挂低通滤波器但如果你选择自己动手写重采样算法就必须自行处理低通滤波否则几乎必然产生明显的混叠。Option 1MediaFoundationResamplerWindows这是 NAudio 中功能最强大的重采样器包装了 Windows 自带的 Media Foundation 重采样 MFTCLSID_CResamplerMediaObjectGUID 为f447b69e-1884-4a7e-8055-346f74d6edb3见 MediaFoundationResampler.cs在 Windows 10 及之后所有受支持的 Windows 版本上均可使用。能力与特点可调质量ResamplerQuality取值 16060 为最高质量1 为线性插值默认已是 60。它对应底层 MFT 的IWMResamplerProps.SetHalfFilterLength即半滤波器长度见 MediaFoundationResampler.cs。足够快官方文档说明其速度足以在最高质量档位下实时运行。灵活可以在重采样同时改变声道数与位深度仅限 PCM 与 IEEE float 输入/输出源码中IsPcmOrIeeeFloat会校验这一点并抛出ArgumentException见 MediaFoundationResampler.cs。输入输出约束构造函数要求输入输出均为 PCM 或 IEEE float若传入非此类格式会立即抛异常同时会在构造时探测 COM 对象若系统缺少重采样 DLL 会快速失败fail fast而不是等到第一次 Read 才报错见 MediaFoundationResampler.cs。使用示例MP344.1kHz重采样到 16kHzusing NAudio.Wave; int outRate 16000; var inFile test.mp3; var outFile test resampled MF.wav; using var reader new MediaFoundationReader(inFile); var outFormat new WaveFormat(outRate, reader.WaveFormat.Channels); using var resampler new MediaFoundationResampler(reader, outFormat); // resampler.ResamplerQuality 60; // default 已经是 60最高质量 WaveFileWriter.CreateWaveFile(outFile, resampler);要点说明它接受IWaveProvider作为输入输出格式由传入的WaveFormat决定。示例中outFormat保持源文件的声道数只改采样率。构造器还有一个便捷重载MediaFoundationResampler(sourceProvider, outputSampleRate)只指定目标采样率会按源格式自动构造输出 WaveFormatPCM 保持位深度、IEEE float 输出 float 格式见 MediaFoundationResampler.cs。若同时想改变位深度或声道数把outFormat改成对应的WaveFormat(sampleRate, bitsPerSample, channels)即可例如输出 16kHz/16bit/单声道。需要在重采样开始前设置ResamplerQuality其 setter 会对 160 范围做校验见 MediaFoundationResampler.cs。Option 2MacAudioConvertermacOSmacOS 的 wrappers 包NAudio.MacOS中提供了与MediaFoundationResampler同等强大的平台级重采样器MacAudioConverter它包装了 macOS Audio Toolbox 的 AudioConverter。文档明确提示该包目前仅以预发布pre-release形式提供安装时需要--prerelease参数dotnet add package NAudio.MacOS --prerelease前提此方案必须运行在 macOS 上源码以[SupportedOSPlatform(ios2.0)]与[SupportedOSPlatform(macos10.2)]标注见 MacAudioConverter.cs。能力与特点质量与 Windows Media 重采样器相当并且更灵活可以显式选择重采样算法、质量档位与抖动dithering算法。唯一的限制不能在重采样过程中随时更改输入流的任何格式属性这是与MediaFoundationResampler的主要差异见 MacAudioConverter.cs。通道映射支持把输入声道映射到不同输出声道甚至用-1禁用某些输入声道。格式约束与 Windows 版本一致只接受 PCM 与 IEEE float 格式VerifyFormatIsIeeeFloatOrPCM校验见 MacAudioConverter.cs。核心可配置项源码枚举属性可选值说明QualityAudioConverterQuality.Min(0)、Low(0x20)、Medium(0x40)、High(0x60)、Max(0x7F)默认 Normal质量档位见 AudioConverterQuality.csComplexityLinear线性插值最低质量最便宜、Normal默认、Mastering更高品质更昂贵、MinimumPhase最小相位脉冲响应具体噪底随质量档位变化Low≈-96dB、Medium≈-144dB、High≈-160dB 且内部使用双精度重采样算法见 AudioConverterSampleRateComplexity.csDitheringNone默认、TPDF三角概率密度白噪声抖动、NoiseShaping感知加权噪声整形抖动仅 macOS 支持见 AudioConverterDitheringAlgorithm.csDitheringBitLengthuint对指定位长度应用预设抖动算法仅 macOS 支持Complexity与Quality的交互值得注意文档强调重采样质量还取决于你使用的重采样算法例如MinimumPhase模式下同样的Low/Medium/High档位对应不同的噪声底水平且MinimumPhase High比Mastering Low快数倍。另外Linear模式下InitialPhase与PrimeMethod属性不生效。SetChannelMap(int[] channelMap)用于自定义声道映射数组长度必须等于输出声道数每个元素是源格式的声道索引-1表示该输出声道不使用任何输入声道。源码注释中给出的示例是立体声输入复制到四声道输出的后两个声道int[] chMap [ 0, 1, 0, 1 ]; theConverter.SetChannelMap(chMap);另外MacAudioConverter构造器内置了一个贴心处理当源为单声道、目标为多声道时默认的 AudioConverter 行为是只把单声道数据送到第一个声道、其余声道静音因此源码会自动把通道映射表填为全 0让单声道信号铺满所有输出声道见 MacAudioConverter.cs。如果遇到源端数据流不连续discontinuity可调用Reset()重置转换器内部缓冲状态。使用示例MP3 重采样到 16kHzusing NAudio.Wave; using NAudio.MacOS.AudioToolbox; int outRate 16000; var inFile test.mp3; var outFile test resampled AudioConverter.wav; using var reader ExtendedAudioFileReaderFromURL.CreateFromFile(inFile); var outFormat new WaveFormat(outRate, reader.WaveFormat.Channels); using var resampler new MacAudioConverter(reader, outFormat); // 默认是 NormalMin 是最低Max 是最高。 // 重采样质量同时也取决于所使用的重采样算法。 // resampler.Quality AudioConverterQuality.Max; WaveFileWriter.CreateWaveFile(outFile, resampler);要点说明输入读取使用 macOS 包的ExtendedAudioFileReaderFromURL继承自ExtendedAudioFileServicesReader见 ExtendedAudioFileReaderFromURL.cs而非 Windows 专用的MediaFoundationReader。如需更高质量可组合设置例如resampler.Quality AudioConverterQuality.Max; resampler.Complexity AudioConverterSampleRateComplexityConstants.Mastering;Read方法要求缓冲长度不小于目标格式的块对齐BlockAlign否则抛出ArgumentException见 MacAudioConverter.cs。Option 3WdlResamplingSampleProvider跨平台第三种方案基于Cockos WDL resamplerNAudio 获得了作者 Justin Frankel 的许可使用。它工作在浮点样本域因此输入需要ISampleProvider。这是唯一一个完全托管fully managed代码实现的重采样器可在没有 Media Foundation 的任何跨平台环境Linux、macOS、移动端等中使用。底层原理源码级核心算法位于 WdlResampler.cs由 C 版 WDL resampler 移植为 C#默认使用float作为样本类型与 sinc 滤波器系数类型。包装类 WdlResamplingSampleProvider.cs 构造时保留源声道数目标格式固定为WaveFormat.CreateIeeeFloatWaveFormat(newSampleRate, channels)随后配置 WDL 引擎——SetMode(true, 2, false)开启插值并使用 2 个滤波器、SetFilterParms()采用默认滤波参数filterpos 0.693、filterq 0.707、SetFeedMode(false)设为输出驱动pull 模式、最后SetRates(sourceRate, newSampleRate)设定源/目标采样率见 WdlResamplingSampleProvider.cs。读取时按输出帧数 → ResamplePrepare 计算需要的输入帧数 → 从源读取 → ResampleOut 生成输出的流程驱动天然适合链式 SampleProvider 管道见 WdlResamplingSampleProvider.cs。使用示例MP3 重采样到 16kHz 并写出 16bit WAVint outRate 16000; var inFile test.mp3; var outFile test resampled WDL.wav; using (var reader new AudioFileReader(inFile)) { var resampler new WdlResamplingSampleProvider(reader, outRate); WaveFileWriter.CreateWaveFile16(outFile, resampler); }要点说明AudioFileReader负责把任意格式解码为浮点正好满足ISampleProvider要求。WaveFileWriter.CreateWaveFile16会在写文件时把浮点样本转换为 16bit因此无需额外处理位深度。与媒体框架方案不同WDL 方案没有Quality之类的公开设置WdlResamplingSampleProvider固定采用 2 滤波器 插值的默认配置更底层的WdlResampler.SetMode/SetFilterParms均带可选参数供进阶用户直接操作 Dsp 层。优点与不足优点纯托管、跨平台逻辑上只需引入 NAudio.Core 即可不依赖操作系统组件。不足性能不一定比MediaFoundationResampler或 macOS 的MacAudioConverter更快。在追求极致吞吐的 Windows 实时场景优先考虑平台原生方案。Option 4ACM 重采样器Windows遗留方案WaveFormatConversionStream是 NAudio 从早期版本就提供的 ACMAudio Compression Manager 重采样器属于遗留方案文档明确建议新代码优先使用MediaFoundationResampler或WdlResamplingSampleProvider。限制只能重采样16bit 音频不能同时改变声道数输入必须是WaveStream不是IWaveProvider。其实现是把 WaveStream 包装成走 ACM Codec 的WaveFormatConversionProvider并基于源/目标格式的AverageBytesPerSecond估算转换后长度与位置映射见 WaveFormatConversionStream.cs。正因如此它的长度/位置只是估算值不适合需要精确 seek 的场景。使用示例MP3 重采样到 16kHzint outRate 16000; var inFile test.mp3; var outFile test resampled ACM.wav; using (var reader new Mp3FileReader(inFile)) { var outFormat new WaveFormat(outRate, reader.WaveFormat.Channels); using (var resampler new WaveFormatConversionStream(outFormat, reader)) { WaveFileWriter.CreateWaveFile(outFile, resampler); } }该方案位于NAudio.WinMM程序集中WaveFormatConversionStream.cs仅适用于 Windows。同一程序集中还有WaveFormatConversionProvider可直接处理IWaveProvider但同样的 16bit、不可改声道数限制依然适用。Option 5自己动手实现重采样由于 NAudio 让开发者直接访问原始样本ISampleProvider.Read(Spanfloat)、IWaveProvider.Read(Spanbyte)你完全可以自行编写重采样算法例如线性插值或更复杂的多项式插值。但文档给出了明确的警告如果不同时编写低通滤波器你几乎必然会遇到严重的混叠问题。既然 NAudio 已经内置了 WDL 重采样器所有需要托管重采样器的场景都应该直接使用它。换句话说自己实现通常只在教学、实验或对算法有特殊定制需求时才有意义生产代码应优先复用官方方案。方案选择速查方案平台输入类型质量是否可同时改声道/位深状态MediaFoundationResamplerWindows 10IWaveProviderPCM/IEEE float160 可调默认 60是推荐MacAudioConvertermacOSiOS 部分功能受限IWaveProviderPCM/IEEE floatMin/Max等五档 算法/抖动可选是含通道映射推荐需--prerelease安装WdlResamplingSampleProvider跨平台纯托管ISampleProvider浮点固定默认配置品质良好否仅采样率推荐跨平台首选WaveFormatConversionStreamACMWindowsWaveStream依赖 ACM codec否仅采样率限 16bit遗留仅旧代码选型建议一句话总结Windows 实时/高性能场景用MediaFoundationResamplermacOS 场景用MacAudioConverter需要跨平台或纯托管的场景用WdlResamplingSampleProviderACM 留给历史代码维护。延伸阅读重采样的典型实战场景MixTwoAudioFilesToWav.md混音前统一采样率、Resampling.md本文档原文输出设备采样率匹配相关AsioPlayback.md、OutputDeviceTypes.md相关实现源码MediaFoundationResampler.cs、MacAudioConverter.cs、WdlResamplingSampleProvider.cs、WdlResampler.cs、WaveFormatConversionStream.cs测试与示例可在 NAudio.Windows.Tests 与 NAudio.Core.Tests 中检索重采样相关用例结合真实项目验证各方案行为。赞分享音视频音频处理【免费下载链接】NAudioAudio and MIDI library for .NET项目地址https://gitcode.com/gh_mirrors/na/NAudio点击查看免费下载相关推荐Jest ES6 类 Mock 完全指南四种方式与源码级原理剖析Jest ES6 类 Mock 完全指南四种方式与源码级原理剖析 导读ES6 class 本质上是带语法糖的构造函数因此 Jest 中一切 ES6 cla测试质量保障代码覆盖率开发工具React-Vis 样式控制完全指南四种策略与源码级原理React Vis 样式控制完全指南四种策略与源码级原理 本指南围绕 docs/style.md https://link.gitcode.com/i/43c数据可视化图表库前端nnU-Net v2 推理完全指南nnUNetPredictor 四种预测模式与源码级原理剖析nnU Net v2 推理完全指南nnUNetPredictor 四种预测模式与源码级原理剖析 导读 本文围绕 nnU Net v2 推理模块 nnune人工智能深度学习计算机视觉医疗健康上一篇Midway info 组件应用信息查看与安全管控实战指南下一篇3分钟学会使用ncmdumpGUI免费转换网易云音乐NCM文件的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考