2017-08-14 291 views

回答

0

沒有內置功能,但是如果您使用AudioFileReader,則可以檢查所有樣本的值以查找最大絕對樣本值。從這裏你可以計算出原始文件可以被削減多少。

然後,您可以使用AudioFileReaderVolume屬性來放大音頻,然後使用WaveFileWriter.CreateWaveFile將其寫入新的(IEEE浮點)WAV文件。 WaveFileWriter.CreateWaveFile16可以在正常化後使用,如果你想要一個16位輸出。

下面是一些非常簡單的示例代碼

var inPath = @"E:\Audio\wav\input.wav"; 
var outPath = @"E:\Audio\wav\normalized.wav"; 
float max = 0; 

using (var reader = new AudioFileReader(inPath)) 
{ 
    // find the max peak 
    float[] buffer = new float[reader.WaveFormat.SampleRate]; 
    int read; 
    do 
    { 
     read = reader.Read(buffer, 0, buffer.Length); 
     for (int n = 0; n < read; n++) 
     { 
      var abs = Math.Abs(buffer[n]); 
      if (abs > max) max = abs; 
     } 
    } while (read > 0); 
    Console.WriteLine($"Max sample value: {max}"); 

    if (max == 0 || max > 1.0f) 
     throw new InvalidOperationException("File cannot be normalized"); 

    // rewind and amplify 
    reader.Position = 0; 
    reader.Volume = 1.0f/max; 

    // write out to a new WAV file 
    WaveFileWriter.CreateWaveFile(outPath, reader); 
} 
+0

它可以很好地,但它使我的文件很大,從10MB的原件269mb ...任何想法,爲什麼?我可以解決嗎? –

+0

好像文件仍然像真實模式,我需要壓縮它,任何想法如何做到這一點或以其他方式讓它恢復正常? –