为啥 NAudio 会创建一个两倍于应有大小的 WAV 文件?

Posted

技术标签:

【中文标题】为啥 NAudio 会创建一个两倍于应有大小的 WAV 文件?【英文标题】:Why is NAudio creating a WAV file that's twice the size it should be?为什么 NAudio 会创建一个两倍于应有大小的 WAV 文件? 【发布时间】:2019-05-15 15:13:29 【问题描述】:

我正在使用这个相当标准的代码示例将多个 WAV 文件混合到一个输出文件中(为清楚起见,省略了 Dispose 调用):

public static void MixAudioFiles(IEnumerable<FileObject> input, FileObject output)

    var mixer = new WaveMixerStream32  AutoStop = true ;

    foreach (var file in input)
    
        var reader = new WaveFileReader(file.FullName);

        mixer.AddInputStream(new WaveChannel32(reader));
    

    WaveFileWriter.CreateWaveFile(output.FullName, new Wave32To16Stream(mixer));

但输出文件的大小总是输入文件的两倍,尽管使用了Wave32To16Stream

我在这里错过了什么?

【问题讨论】:

您可能要从单声道转为立体声? 完全有可能,但我不知道怎么做。默认情况下,此链中的 WaveXXX 对象之一是否具有该效果? @MarkHeath:似乎问题在于混合文件有2个通道,但输入文件只有1个。我认为这是因为WaveMixerStream32使用了WaveFormat有2个通道,但我看不到任何方法可以创建仅使用 1 个通道的混音器。 看看MixingSampleProvider - WaveMixerStream32WaveChannel32 是非常古老的类,最好不要再使用了 【参考方案1】:

谢谢Mark,它为我指明了正确的方向。对于遇到此问题的其他人,这是工作代码:

    public static void MixAudioFiles(IEnumerable<string> input, string output)
    
        var wf = new WaveFormat(16000, 1);

        var mixer = new NAudio.Wave.SampleProviders.MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(wf.SampleRate, wf.Channels));

        foreach (var file in input)
        
            var reader = new WaveFileReader(file);

            mixer.AddMixerInput(reader);
        

        //write the mix file
        WaveFileWriter.CreateWaveFile16(output, mixer);

请注意,我省略了 Dispose 调用。确保添加这些以防止资源泄漏。

【讨论】:

以上是关于为啥 NAudio 会创建一个两倍于应有大小的 WAV 文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 mysqli_fetch_array() 返回数组大小的两倍? [关闭]

为啥 React.createElement() 会创建一个对象?

为啥我的函数每次调用时都会创建一个新对象?

为啥 GridControl 在执行后会创建一个额外的列/空间?

为啥hibernate会创建一个连接表和一个连接列?

Django 为啥我应用迁移时会创建一个字段?