Comment lire les données dans un fichier wav à un tableau
J'ai besoin d'obtenir tous les échantillons d'un fichier wav en un tableau (ou deux si vous avez besoin de faire garder la stéréo), de sorte que je peux appliquer certaines modifications. Je me demandais si c'est facile à faire (de préférence sans les bibliothèques externes). Je n'ai aucune expérience avec la lecture de fichiers audio, donc je ne sais pas beaucoup sur le sujet.
- Pourquoi ne voulez-vous pas utiliser des bibliothèques? Si c'est un problème de licence, un LGPL ou une licence similaire. Si non, eh bien, .NET est construit sur les bibliothèques de sorte que vous n'avez pas de code tout vous-même. Installer NuGet, obtenir NAudio (ou d'une autre bibliothèque audio), et de ne pas réinventer la roue :). Ou de le faire en C 😉
- Pourquoi réinventer la roue, une mauvaise chose? Non seulement vous sentir bon pour le travail vous-même, vous apprendrez également beaucoup dans le processus. Si vous êtes de codage pour le plaisir et n'ont pas de contraintes de temps, alors je dirais certainement réinventer la roue!
Vous devez vous connecter pour publier un commentaire.
Fichiers WAV (au moins, non compressé) sont assez simple. Il y a un en-tête, les données suit.
Voici une superbe référence:
https://ccrma.stanford.edu/courses/422/projects/WaveFormat/(miroir)fmt
" subchunk est 0x0003 (WAVE_FORMAT_IEEE_FLOAT
)Ce code devrait faire l'affaire. Il convertit un fichier wave normalisé double array (de -1 à 1), mais il doit être facile d'en faire un int/tableau short à la place (suppression de la
/32768.0
peu et ajouter 32768 à la place). Leright[]
tableau sera mis à null si la lecture du fichier wav est trouvé être mono.Je ne peux pas prétendre que c'est complètement à l'épreuve des balles (potentiel tout-en-un d'erreurs), mais après la création d'un 65536 tableau d'échantillons, et la création d'une vague de -1 à 1, aucun des échantillons semblent aller au - 'à travers' le plafond ou le plancher.
(secondByte << 8)
pour une 8 bits type commebyte
.byte
est un 8 bits entier signé et ne peut pas être bitshifted par 8 car il n'y a pas d'espace pour pousser ces 8 bits.Otherwise, both operands are converted to type int.
.wav.Length
au lieu de cela, et enveloppé l'ensemble de las
définition formule dans une(short)
exprimés. Vous aurez bien sûr besoin d'ajouterusing System.IO;
à vos propres classes pour utiliser lesFile
classe, il l'utilise pour ouvrir le fichier wav.En supposant que votre fichier WAV contient PCM 16 bits (ce qui est le plus courant), vous pouvez utiliser NAudio le lire dans un tableau d'octets, puis copiez-la dans un tableau d'entiers de 16 bits pour des raisons de commodité. Si il est en stéréo, les échantillons seront entrelacées à gauche, à droite.
Je sais que tu voulais éviter de bibliothèques tierces, mais si vous voulez être sûr de faire face avec les fichiers WAV avec extra morceaux, je suggère d'éviter les approches à la recherche d'44 octets dans le fichier.
Au moment de la rédaction, personne n'a abordé 32-bits ou 64-bits codés Wav.
Le code suivant poignées 16/32/64 bits, mono/stéréo:
http://hourlyapps.blogspot.com/2008/07/open-source-wave-graph-c-net-control.html
Ici est un Contrôle qui affiche le Spectre d'un fichier Wav ,qui Sert également un Byte[] de Décodé le Fichier Wav, où vous pouvez jouer et/ou de Modifier leurs Valeurs .
Il suffit de télécharger le Contrôle et il est assez bon pour WAV de manipulation de Fichiers.
Pour obtenir le fichier wav dans un tableau, tu peux faire ça:
byte[] data = Fichier.ReadAllBytes("Chemin Du Fichier");
mais comme Fletch dit, vous avez besoin d'isoler les données à partir des en-têtes. Il doit être juste un simple décalage.
Essayer Lire des données audio à partir de la matrice de