我必须使用纯 C# 解决方案对音频进行重采样,它可以产生与 FFmpeg 的音频采样完全相同的结果。
FFmpeg 首先构建某种多相滤波器组,然后将其用于采样过程(抱歉措辞含糊,但我对这个主题不太熟悉)。根据这份简报documentation ,初始化可以这样定制:
AVResampleContext* av_resample_init(
int out_rate,
int in_rate,
int filter_length,
int log2_phase_count,
int linear,
double cutoff
)
参数是:
- out_rate: 输出采样率
- in_rate:输入采样率
- filter_length:滤波器组中每个FIR滤波器相对于截止频率的长度
- log2_phase_count:多相滤波器组中条目数的log2
- 线性:如果为 1,则使用的 FIR 滤波器将在最接近的 2 个之间线性插值,如果为 0,则使用最接近的滤波器
- cutoff:截止频率,1.0对应输出采样率的一半
我需要使用可在相同深度配置的 C# 库。我一直在尝试使用 NAudio(更具体地说,它的 WaveFormatConversionStream
类),但是在那里,我只能设置输入和输出采样率,所以我没有得到预期的结果。
那么,有没有可以使用与 FFmpeg 相同的设置重新采样的 C# 库?还是具有几乎所有这些设置或类似设置的?注意:我需要 C# 解决方案,而不是包装器!
最佳答案
除了 WaveFormatConversionStream
(使用 ACM 编解码器)之外,NAudio 还包括另一个可以作为 DirectX 媒体对象 (DMO) 访问的重采样器,或者(在 NAudio 1.7 的最新预发布版中)作为媒体基金会转型。这些可以在 Windows Vista 及更高版本中使用。遗憾的是,我认为它们在 XP 中不可用(但自从我尝试以来已经有一段时间了)。
找到的DMO版本在Resampler
类中(还有一个ResamplerDmoStream
),Media Foundation Version在MediaFoundationResampler
中。它们实际上都创建了相同的底层对象,但在 MFT 版本上我添加了一个名为 ResamplerQuality
的属性,它允许您在 1(线性插值)和 60(最大质量)之间进行选择。在 this article我包括了一个重新采样的正弦波扫描的频谱图,你会发现质量非常好。
如果您想走 DMO 路线,您可以轻松地对 Resampler
类进行相同的更改,因为它可以访问 IWMResamplerProps。 ,它允许您设置半滤波器长度(1 到 60 之间的相同值)。
关于具有与 FFmpeg 相同功能的音频重采样 C# 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16121635/