Notre application doit connaître le nombre d'échantillons des fichiers audio qu'elle charge. La bibliothèque que nous utilisons peut déterminer de manière fiable la fréquence d'échantillonnage, mais pas le nombre d'échantillons. Est-il possible pour nous de calculer le nombre d'échantillons à partir de la taille du fichier et du taux d'échantillonnage?Étant donné un fichier WAV, sa taille de fichier et sa fréquence d'échantillonnage, est-il possible de calculer le nombre d'échantillons?
Répondre
En supposant que le fichier WAV est PCM, vous pouvez le calculer en utilisant la taille du bloc de données. Le nombre d'octets par échantillon est simplement le nombre de bits par échantillon divisé par huit. Le nombre de bits par échantillon sera présent dans la structure WAVEFORMAT. Cela peut être utilisé pour obtenir avec précision le nombre d'échantillons.
Quelle est la marque dite. Non, normalement vous devez interpréter l'en-tête. Mais si le format, le nombre de canaux et le nombre de bits par échantillon sont connus et identiques pour tous les fichiers, vous pouvez théoriquement le calculer à partir de la taille du fichier. WAV est un format simple, malheureusement il y a eu beaucoup de variations étranges du format des grands et petits développeurs de matériel et de logiciel au cours des années. Habituellement, vous pouvez compter sur le format kasher si les fichiers proviennent d'un éditeur d'ondes conventionnelles. Donc, si les échantillons sont standardisés en les exportant à partir de WaveLab ou similaire, vous pouvez sauvegarder l'écriture du (petit) code pour l'interpréteur d'en-tête.
La description du format .wav le plus facile à lire est here. StripWav est un petit programme pour normaliser les échantillons; il y a aussi un outil de ligne de commande qui est plus capable: sox. Sox prend en charge les travaux par lots, donc ce serait mieux que d'utiliser un éditeur d'onde - en supposant que l'ensemble des fichiers .wav est un donné et non 'dynamique'. Donc: Si vous pouvez les normaliser une fois pour toutes avec un travail par lot, cela devrait être possible. J'ai utilisé cette description de format et Sox pour faire grand effet plusieurs fois, bonne chance :)
En format PCM wav l'en-tête contient l'information appelée blockalign du nombre d'octets qu'un seul échantillon prend.
Généralement si vous avez un fichier WAV RIFF PCM standard sans métadonnées (cas usuel). Le blockalign est un entier de 2 octets à l'offset 32 (le 33ème au 34ème octet depuis le début du fichier wav). Et la taille de fichier de données appelée datasize est un entier de 4 octets à décalage 40 (les 41ème à 44ème octets forment le début du fichier wav).
Maintenant, datasize/blockalign est ce que vous voulez.
PS
Si vous avez un format wav plus compliqué, si elle est RIFF, le format infomation et les données sont mises en différents « morceaux » (ainsi que d'autres morceaux que vous ne pouvez pas besoin), et les décalages mentionnés ci-dessus peuvent ne pas corriger, alors vous devriez regarder en morceaux. Dans votre cas, vous devez trouver fmt et le bloc de données. Chaque bloc commence par une donnée ASCII codée sur 4 octets appelée FOURCC, 'fmt' indique que les informations de format d'inclusion de bloc et 'données' indique un bloc de données. Juste après FOURCC est un entier de 4 octets indiquant la taille (en octets) du morceau après (FOURCC et ces 4 octets ne sont pas comptés).
Références:
je peux travailler la taille du bloc de données à partir de la taille du fichier, ou dois-je besoin de savoir plus - par exemple taille de l'en-tête – Simon
Les fichiers WAV comportent toujours un segment de format et un bloc de données. Ils peuvent avoir d'autres morceaux. La seule façon d'être sûr de la taille du bloc de données est de le trouver et de lire son paramètre de taille. Quelle langue et bibliothèque utilisez-vous? –
C# et MediaInfoLib. – Simon