Fichier wav en lecture C ++, subchunk1size = 18

Habituellement, la taille d’un fichier wav est inférieure à 16. Cependant, j’ai quelques fichiers wav qui ont subchunk1size = 18. J’ai du code c ++ pour lire le fichier wav qui a subchunk1size = 16. Maintenant, je veux lire les fichiers wav qui ont subchunk1size = 18. Toute aide serait appréciée.

typedef struct header_file { char chunk_id[4]; int chunk_size; char format[4]; char subchunk1_id[4]; int subchunk1_size; short int audio_format; short int num_channels; int sample_rate; int byte_rate; short int block_align; short int bits_per_sample; char subchunk2_id[4]; int subchunk2_size; } header; 

Ce qui précède est struct header_file dans mon code pour lire le fichier wav avec subchunk1size = 16.

Les fichiers WAV n’ont pas une structure aussi rigide que ce à quoi vous vous attendiez. Le bloc “fmt” n’est pas nécessairement le premier à suivre l’en-tête du fichier (bien qu’il le soit généralement), et sa taille n’est pas nécessairement de 16 octets (bien que ce soit souvent le cas). L’audio compressé peut être stocké dans un fichier wav. Dans ce cas, le champ audio_format sera différent de 1 et le bloc “fmt” pourra avoir une taille différente de 16 octets.

La manière appropriée et flexible d’parsingr des fichiers wav consiste à utiliser des structures plus granulaires:

 struct wave_header { char chunk_id[4]; int chunk_size; char format[4]; }; struct riff_chunk_header { char id[4]; int size; }; struct wave_fmt_chunk { short audio_format; short num_channels; int sample_rate; int byte_rate; short block_align; short bits_per_sample; }; 

Ensuite, votre logique d’parsing devrait être (en prenant soin de valider les données que vous avez lues à chaque étape):

  1. Lire un wave_header
  2. Lire un riff_chunk_header
  3. Si l’ID de l’en-tête de morceau que vous avez lu n’est pas “fmt”, ignorez le morceau (sa taille est en octets) et passez à l’étape 2 pour lire le prochain en-tête.
  4. Lire le champ audio_format
  5. Interprétez le rest des données du bloc “fmt” en fonction de cet audio_format . Si c’est 1, vous avez des données PCM et le bloc devrait avoir vos 16 octets prévus. Si ce n’est pas 1, vous devez trouver de la documentation sur ce format de compression.

En général, il est également judicieux d’ignorer les données supplémentaires. Par conséquent, si vous voyez un fichier wav codé en PCM avec un bloc “fmt” de 18 octets, essayez d’ignorer les 2 derniers octets et de voir où cela vous mène.

Les fichiers ont une structure de format rigide. Si cette structure n’est pas respectée, certaines applications risquent de ne pas pouvoir lire ou ouvrir les fichiers.

À la question initiale: les fichiers wave peuvent être divisés en deux groupes. Le premier groupe est constitué de fichiers avec plus de 2 canaux d’audio OU avec une résolution en bits PCM supérieure à 16, voire les deux. Le deuxième groupe est composé de fichiers qui ne répondent pas à ces deux conditions, à savoir 1 ou 2 canaux de 16 bits maximum. Au fil des ans, Microsoft a modifié les structures contenues dans les fichiers wav pour s’adapter aux avancées de la technologie audio. Plus précisément, ils ont ajouté un champ de 2 octets appelé cbSize à la structure WAVEFORMATEX. C’est pourquoi les valeurs 16 et 18 correspondent à subchunk1size. La différence de deux octets dépend de la présence ou de l’absence du champ cbSize. Les fichiers audio modernes correctement formés utilisant la version actuelle de WAVEFORMATEX auront une taille de sous-segment 1 de 18, quel que soit le nombre de canaux ou la résolution en bits. Les anciens fichiers créés avant que Microsoft ne modifie la structure WAVEFORMATEX ont une taille de sous-taille de fichier de 16.

Voici ma politique:

Lors de la lecture d’un fichier, subchunk1size peut être 16 ou 18, le code doit donc s’adapter en conséquence. Il y a beaucoup d’anciens fichiers wav avec l’ancien format, ou un fichier moderne pourrait ne pas être écrit correctement avec l’ancienne structure WAVEFORMATEX sans le champ cbSize.

Lors de la création d’un fichier wav, j’utilise toujours une taille de subchunk1 de 18 indépendamment du nombre de canaux ou de la profondeur de bits, car Microsoft a définitivement modifié la structure de WAVEFORMATEX et rend le fichier conforme à spec.

Windows Media Player est utile pour vous assurer que votre fichier wav peut être ouvert et lu.

http://msdn.microsoft.com/en-us/library/windows/desktop/dd390970%28v=vs.85%29.aspx