3

我必须使用纯 C# 解决方案来重新采样音频,这可以产生与 FFmpeg 的音频采样完全相同的结果。

FFmpeg首先构建某种多相滤波器组,然后将其用于采样过程(抱歉措辞含糊,但我对这个主题不太熟悉)。根据这个简短的文档,初始化可以这样定制:

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类),但是在那里,我只能设置输入和输出采样率,所以我没有得到预期的结果。

那么,是否有一个 C# 库可以使用与 FFmpeg 相同的设置重新采样?还是具有几乎所有这些设置或类似设置的?注意:我需要一个 C# 解决方案,而不是包装器!

4

1 回答 1

2

除了WaveFormatConversionStream(使用 ACM 编解码器)之外,NAudio 还包括另一个重采样器,可以作为 DirectX 媒体对象 (DMO) 访问,或者(在 NAudio 1.7 的最新预发行版中)作为媒体基础转换访问。这些可以在 Windows Vista 及更高版本中使用。可悲的是,我认为它们在 XP 中不可用(但自从我尝试以来已经有一段时间了)。

找到的 DMO 版本在Resampler类中(还有一个ResamplerDmoStream),Media Foundation 版本在MediaFoundationResampler. 它们实际上都创建了相同的底层对象,但在 MFT 版本中,我添加了一个名为的属性ResamplerQuality,它允许您在 1(线性插值)和 60(最大质量)之间进行选择。在本文中,我包含了重新采样的正弦波扫描的频谱图,您会看到质量非常好。

Resampler如果您想走 DMO 路线,您可以轻松地对类进行相同的更改,因为它可以访问IWMResamplerProps,它允许您设置半过滤器长度(这是 1 到 60 之间的相同值)。

于 2013-04-21T16:54:53.723 回答