2017-08-15 286 views
0

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

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

我的代码没有错误,但输出是一个包含纯沉默的文件。

是否有任何其他方式将文件转换为单声道?

+0

.wav文件是一个字节数组。所以你可以在没有任何外部库的情况下进行处理。唯一的问题是你如何定义转换?我的意思是,如果你有两个频道 - L,R - 你期望的输出是什么?他们的总和?平均? – TDG

+0

是的,我知道,但我认为我不必花时间从头开始计算wav文件格式和代码。像NAudio这样的图书馆应该有这样的东西,不是吗? 事实上,我几乎可以单独使用mscorlib来做任何事情,但有什么意义呢? – ulu

+0

为什么你需要mscorlib以字节数组的形式读取wav文件,然后循环播放音频数据并做简单的计算? – TDG

回答

0

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

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参数传递1outFomat

+0

它适用于我的电脑,但不幸的是,不在Azure上 - 无法加载DLL'mfplat.dll'。我想知道是否有可能在不使用本地DLL的情况下进行转换。 – ulu

0

此代码为我工作,甚至在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),因为源是在浮点格式。