2017-08-15 291 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),因爲源是在浮點格式。