具有与 FFmpeg 相同功能的音频重采样 C# 库

标签 c# c++ c ffmpeg naudio

我必须使用纯 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/

相关文章:

c# - 使用数据绑定(bind)访问 DataTemplate 中的 WPF 组件

c# - 在 ASP.NET 中检索 LAST_INSERT_ID 值时记录发布两次

c++ - 将 Vector 的第一个元素 move 到最后一个元素

c++ - 将字符串的地址与 NULL 进行比较

objective-c - 在Apple上合并静态库

c# - 条件变量的 TPL 等价物是什么?

c# - 在 Windows 中的两个不同应用程序之间共享 sqlite 数据库

c++ - 程序永远不会到达我可以输入信息的部分

c - 为什么C函数这么长?

c - 在 c99 中使用 clock_gettime 时出现编译错误