将wav文件转换为单声道

Posted

技术标签:

【中文标题】将wav文件转换为单声道【英文标题】:Converting wav file to mono 【发布时间】:2017-08-15 10:49:01 【问题描述】:

我正在尝试使用 NAudio 将立体声 .wav 文件转换为单声道。一个要求是我不能使用任何本机调用,因为我需要在 Azure 上运行此代码。这是我带来的:

using (var waveFileReader = new WaveFileReader(sourceFileName))
    
        var toMono = new StereoToMonoProvider16(waveFileReader);
        WaveFileWriter.CreateWaveFile(destFileName, toMono);
    

我的代码可以正常工作,但输出是一个包含纯静默的文件。

还有其他方法可以将文件转换为单声道吗?

【问题讨论】:

.wav 文件是一个字节数组。所以你可以在没有任何外部库的情况下处理它。唯一的问题是如何定义转换?我的意思是,如果你有两个通道 - L,R - 你期望的输出是什么?他们的总和?平均? 是的,我知道,但我认为我不必花时间来计算 wav 文件格式并从头开始编写所有这些代码。当然,像 NAudio 这样的库应该已经有类似的东西了,不是吗?事实上,我几乎可以单独使用 mscorlib 做任何事情,但有什么意义呢? 为什么需要 mscorlib 将 wav 文件读取为字节数组,然后循环遍历音频数据并进行简单计算? 我的意思是,人们可以单独使用 mscorlib 完成所有任务,但他们仍然使用外部库来节省时间和精力。我可以使用字节和其他东西来解决我的问题,但是 NAudio 为我节省了很多时间和精力。 【参考方案1】:

这段代码对我有用。

public static void StereoToMono(string sourceFile, string outputFile)
    
        using (var waveFileReader = new WaveFileReader(sourceFile))
        
            var outFormat = new WaveFormat(waveFileReader.WaveFormat.SampleRate, 1);
            using (var resampler = new MediaFoundationResampler(waveFileReader, outFormat))
            
                WaveFileWriter.CreateWaveFile(outputFile, resampler);
            
        
    

注意channels 参数是通过1 传递给outFomat

【讨论】:

它可以在我的 PC 上运行,但不幸的是,不能在 Azure 上运行——无法加载 DLL 'mfplat.dll'。我想知道是否可以在不使用本机 DLL 的情况下进行转换。【参考方案2】:

您需要为StereoToMonoProvider16LeftVolumeRightVolume 属性提供值。例如,将它们都设置为 0.5f 以混合通道,或者将左侧设置为 1.0 和右侧设置为 0.0 以丢弃右侧通道

【讨论】:

【参考方案3】:

此代码对我有用,即使在 Azure 上也是如此:

private void ConvertToMono(string sourceFileName, string destFileName) 
    var monoFormat = new WaveFormat(44100, 1);
    using (var waveFileReader = new WaveFileReader(sourceFileName))
    
        var floatTo16Provider = new WaveFloatTo16Provider(waveFileReader);
        using (var provider = new WaveFormatConversionProvider(monoFormat, floatTo16Provider))
        
            WaveFileWriter.CreateWaveFile(destFileName, provider);
        
    


请注意,我使用了一个额外的转换器 (WaveFloatTo16Provider),因为源是浮点格式。

【讨论】:

以上是关于将wav文件转换为单声道的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中将立体声 wav 转换为单声道

将 .caf 文件从立体声转换为单声道

Python将立体声.flac转换为单声道

如何使用 naudio 将立体声 pcm 样本转换为单声道样本

在Javascript中将立体声音频转换为单声道

在Javascript中将立体声音频转换为单声道