Comment puis-je détecter si un fichier WAV a un 44 ou 46 octets d'en-tête?
J'ai découvert qu'il est dangereux de supposer que tous les PCM wav, les fichiers audio ont 44 octets de l'en-tête de données avant que les échantillons de commencer. Bien que ce qui est commun, de nombreuses applications (ffmpeg par exemple), permettra de générer des wav avec un 46 octets d'en-tête et en ignorant ce fait, tout traitement va provoquer un corrompu et illisible fichier. Mais comment pouvez-vous détecter combien de temps l'en-tête est réellement?
Évidemment il y a une manière de le faire, mais j'ai cherché et trouvé peu de discussions sur ce sujet. BEAUCOUP de projets audio y assumer 44 (ou, à l'inverse, 46) selon les auteurs propre contexte.
C'est vrai qu'il n'est pas une excuse pour l'analyse de l'en-tête, mais il y a beaucoup de désinformation là-bas sur le faire. Recherche pour "wav parser" sur Google et beaucoup de top hits contenir le code qui suppose 44 octets de longueur avec pas de discussion. DONC, ne contenait que des conseils vers quelque chose de plus grand. Je suis d'essayer d'attirer l'attention sur ce problème pour la prochaine frustré personne qui va à la recherche.
J'ai toujours trouvé que le WAVE PCM fichier son au format d'une page sur le Center for Computer Research in Music and Acoustics (Standford) site web pour être une ressource utile pour ce genre de chose.
OriginalL'auteur Matt J. | 2013-11-15
Vous devez vous connecter pour publier un commentaire.
Vous devriez vérifier toutes les données d'en-tête afin de voir quelles sont les tailles. Broadcast Wave Format de fichiers contiennent une bien plus grande extension subchunk. Fichiers WAV et AIFF de Pro Tools ont même plus de l'extension des morceaux qui sont des sans-papiers ainsi que des données audio. Si vous voulez être sûr de l'endroit où l'échantillon de données commence et se termine, vous devez examiner pour le segment de données ("data" pour les fichiers WAV et "SSND" pour AIFF).
Comme un examen, tous WAV subchunks conformes au format suivant:
C'est très facile à traiter. Tout ce que vous devez faire est de lire le descripteur, si ce n'est pas celui que vous cherchez, consultez les données de taille et de passer à la prochaine. Un Java simple routine, qui devrait ressembler à ceci:
Par exemple ici, c'est un hasard le fichier WAV que j'ai eu:
Notamment, ici les deux 'fmt' et 'données' légitimement apparaître, entre autres morceaux, car Microsoft RIFF spécification dit que subchunks peuvent apparaître dans n'importe quel ordre. Même certains grands systèmes audio, que je sache, de se tromper et de ne pas tenir compte de cela.
Donc, si vous voulez trouver un certain morceau, une boucle dans le fichier de vérification de chaque descripteur jusqu'à ce que vous trouviez celui que vous cherchez.
Il convertit les 4 octets d'un entier de 32 bits. Par exemple, un entier de 32 bits
00000000000000001000000010000001
(décimal 32897) pourra être divisée en quatre octets,00000000
,00000000
,10000000
et10000001
. Le code avec le décalage de bits prend octets et crée un entier de 32 bits, en décalant chaque octet en place et ensuite les combiner avec de l'or au niveau du bit. Le& 0xFF
partie est spécifique à Java, et expliqué ici.Merci beaucoup!
OriginalL'auteur Radiodef
L'astuce est de regarder les "Subchunk1Size", qui est un entier de 4 octets commençant à 16 octets de l'en-tête. Dans des conditions normales de 44 octets wav, cet entier sera 16 [10, 0, 0, 0]. Si c'est un 46 octets d'en-tête, cet entier sera 18 [12, 0, 0, 0] ou peut-être même plus si il est extra extensible méta-données (rares?).
Les données supplémentaires lui-même (si présent), commence à l'octet 36.
Alors un simple programme C# pour détecter la longueur d'en-tête devrait ressembler à ceci:
OriginalL'auteur Matt J.
En plus de Radiodef excellente réponse, je voudrais ajouter 3 choses qui ne sont pas évidentes.
La seule règle pour les fichiers WAV est l'ESF bloc avant le segment de DONNÉES. En dehors de cela, vous trouverez des morceaux que vous ne connaissez pas, au début, avant que les DONNÉES de morceau et après. Vous devez lire l'en-tête de chaque morceau pour sauter vers l'avant pour trouver le segment suivant.
L'ESF morceau est communément trouvée dans les 16 octets et 18 octets variations, mais la spécification permet en fait de plus de 18 octets.
Si l'ESF chunk' taille d'en-tête de champ dit de plus de 16 ans, les Octets, les 17 et 18 également spécifier le nombre d'octets supplémentaires il y a, donc, si ils sont tous deux nuls, vous vous retrouvez avec un 18 octets de l'ESF morceau identique à 16 octets.
Il est sécuritaire de le lire en seulement les 16 premiers octets de l'ÉQUIPE de bloc et d'analyser ceux qui, ignorant tout de plus.
Pourquoi est-ce important? - pas beaucoup plus, mais Windows XP Media Player est capable de jouer des fichiers WAV 16 bits, mais 24 bits WAV fichiers uniquement si l'ESF morceau a été Étendu (18+ octet) de la version. Il y a beaucoup de plaintes que "Windows ne parvient pas à lire mes 24 bits WAV fichiers", mais si elle avait un 18 octets de l'ESF morceau, il le ferait... Microsoft résolu que, parfois, durant les premiers jours de Windows 7, donc 24 bits avec 16 octets de l'ESF fichiers fonctionnent bien maintenant.
(Récemment ajouté) des tailles de segment avec odd tailles se produire assez souvent. Surtout vu quand un 24 bits mono fichier est fait. Il est difficile de savoir à partir de la spécification, mais la taille de segment spécifie les données réelles de la longueur (la valeur impaire) et un tampon d'octets (zéro) est ajouté après le morceau, et avant le début de la partie suivante. Si les morceaux commencent toujours sur le même périmètre, mais la taille de bloc lui-même est stocké en tant que réelle valeur impaire.
OriginalL'auteur Tomuo