2017-08-14 4 views

Répondre

0

Il n'y a pas de fonctionnalité intégrée, mais si vous utilisez AudioFileReader, vous pouvez examiner les valeurs de tous les échantillons pour trouver la valeur d'échantillon absolue maximale. À partir de là, vous pouvez déterminer jusqu'à quel point le fichier original peut être amplifié sans écrêtage.

Ensuite, vous pouvez utiliser la propriété Volume de AudioFileReader pour amplifier l'audio, puis utilisez WaveFileWriter.CreateWaveFile pour écrire que vers un nouveau (virgule flottante IEEE) fichier WAV. WaveFileWriter.CreateWaveFile16 peut être utilisé si vous souhaitez une sortie 16 bits après la normalisation.

Voici quelques exemples de code très simple

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

Il fonctionne bien, mais il rend mon dossier énorme, de 10mb comme original 269mb ... toute idée pourquoi? puis-je le résoudre? –

+0

semble que le fichier reste comme en mode réel et j'ai besoin de le compresser, une idée de comment faire cela ou d'une autre façon de revenir à la normale? –