2017-05-23 5 views
0

J'utilise NAudio pour ouvrir un fichier wav. Après avoir utilisé la classe SimpleCompressor, je dois aussi normaliser le volume du fichier sur 0db mais je n'ai aucune idée de comment le faire. En ce moment j'ai ceci:Comment normaliser le volume de fichiers wav en C#?

string strCompressedFile = ""; 

byte[] WaveData = new byte[audio.Length]; 


SimpleCompressorStream Compressor = new SimpleCompressorStream(audio); 
Compressor.Enabled = true; 

if (Compressor.Read(WaveData, 0, WaveData.Length) > 0) 
{ 
    //doing the normalizing now 
} 

Comment puis-je obtenir le volume du nouveau tableau d'octets WaveData et comment puis-je changer? Dans WaveData est l'ensemble du fichier wav y compris le FileHeader

+0

https://stackoverflow.com/questions/984729/how-can-i-determine-how-loud-a-wav-file-will-sound –

+0

Merci pour le lien mais je ne sais toujours pas comment pour l'implémenter. Je ne peux pas utiliser d'outil supplémentaire, je dois l'implémenter dans mon logiciel – computermaus

Répondre

0

Vous peut certainement changer la valeur individuelle de l'échantillon afin qu'il convient niveau maximum:

string strCompressedFile = ""; 

byte[] WaveData = new byte[audio.Length]; 

SimpleCompressorStream Compressor = new SimpleCompressorStream(audio); 
Compressor.Enabled = true; 

byte maxLevel = 20; 

if (Compressor.Read(WaveData, 0, WaveData.Length) > 0) 
{ 
    for (int i = 0; i < audio.Length; i++) 
    { 
     if (WaveData[i] > maxLevel) 
     { 
      WaveData[i] = maxLevel; 
     } 
    } 
} 

J'ai ajouté une boucle qui le compare à tous les échantillons et si elle est la valeur est plus élevée que maxLevel nous l'avons mis à maxLevel.

+0

Je ne suis pas très familier avec les fichiers wav mais puis-je simplement définir chaque octet sur le même numéro? N'y a-t-il pas des octets d'en-tête? Dans votre exemple, vous commencez par l'octet 0. L'autre chose que je me demande: est la valeur de chaque octet le volume? Je pensais que c'était le son (par exemple voix enregistré) lui-même à la place ... Je pensais pour la normalisation je dois obtenir le volume maximum puis le calculer à la valeur la plus forte et ensuite utiliser le même facteur pour tous les autres numéros de volume. Mais je n'ai aucune idée de comment obtenir le volume et quelle est la valeur maximale possible – computermaus

+0

Les échantillons sont une représentation numérique du signal analogique, de sorte que chaque valeur d'échantillon est égale à l'amplitude du signal analogique dans le temps donné. Si vous définissez chaque octet sur le même nombre, il représentera le signal analogique en ligne droite, qui est essentiellement le silence. Au lieu de cela, vous devez en quelque sorte ajuster les choix. –

+0

Pour l'enregistrement du son j'ai trouvé un morceau de code qui m'a permis d'implémenter un compteur de volume en tant que barre de progression. mais pour être honnête, je ne comprends pas tout de la partie du code: double somme = 0; pour (var i = 0; i computermaus