web-dev-qa-db-fra.com

Que représentent les octets d'un fichier .wav?

Lorsque je stocke les données dans un fichier .wav dans un tableau d'octets, que signifient ces valeurs? J'ai lu qu'ils sont dans des représentations à deux octets, mais que contiennent exactement ces valeurs à deux octets?

32
user1330691

Vous aurez entendu que les signaux audio sont représentés par une sorte d'onde. Si vous avez déjà vu ces diagrammes d'ondes avec une ligne qui monte et descend - c'est essentiellement ce qu'il y a dans ces fichiers. Jetez un oeil à cette image de fichier de http://en.wikipedia.org/wiki/Sampling_rate

sampling

Vous voyez votre onde audio (la ligne grise). La valeur actuelle de cette onde est mesurée à plusieurs reprises et donnée sous forme de nombre. Voilà les chiffres dans ces octets. Il y a deux choses différentes qui peuvent être ajustées avec ceci: Le nombre de mesures que vous prenez par seconde (c'est le taux d'échantillonnage, donné en Hz - c'est le nombre par seconde que vous prenez). L'autre ajustement est la précision de votre mesure. Dans le cas de 2 octets, vous prenez deux octets pour une mesure (c'est-à-dire des valeurs de -32768 à 32767 normalement). Donc, avec ces chiffres, vous pouvez recréer la vague d'origine (jusqu'à une qualité limitée, bien sûr, mais c'est toujours le cas lors du stockage numérique). Et recréer l'onde originale est ce que votre haut-parleur essaie de faire lors de la lecture.

Il y a d'autres choses que vous devez savoir. Tout d'abord, comme il s'agit de deux octets, vous devez connaître l'ordre des octets (gros endian, petit endian) pour recréer correctement les nombres. Deuxièmement, vous devez savoir combien de canaux vous avez et comment ils sont stockés. En règle générale, vous auriez mono (un canal) ou stéréo (deux), mais plus est possible. Si vous avez plusieurs canaux, vous devez savoir comment ils sont stockés. Souvent, vous les avez entrelacés, ce qui signifie que vous obtenez une valeur pour chaque canal pour chaque point dans le temps, puis toutes les valeurs pour le point suivant dans le temps.

Pour illustrer: Si vous avez des données de 8 octets pour deux canaux et un nombre de 16 bits:

abcdefgh

Ici, a et b constitueraient le premier nombre 16 bits qui est la première valeur pour le canal 1, c et d serait le premier numéro pour le canal 2 . e et f sont la deuxième valeur du canal 1, g et h la deuxième valeur du canal 2. Vous n'y entendriez pas grand-chose car cela ne se rapprocherait pas d'une seconde de données ...

Si vous rassemblez toutes ces informations, vous pouvez calculer le débit binaire dont vous disposez, c'est le nombre de bits d'informations générés par l'enregistreur par seconde. Dans notre exemple, vous générez 2 octets par canal sur chaque échantillon. Avec deux canaux, ce serait 4 octets. Vous avez besoin d'environ 44 000 échantillons par seconde pour représenter les sons qu'un être humain peut normalement entendre. Vous vous retrouverez donc avec 176000 octets par seconde, soit 1408000 bits par seconde.

Et bien sûr, ce ne sont pas des valeurs à 2 bits, mais deux valeurs à 2 octets, sinon vous auriez une très mauvaise qualité.

53
kratenko

Les 44 premiers octets sont généralement un en-tête RIFF standard, comme décrit ici: http://tiny.systems/software/soundProgrammer/WavFormatDocs.pdf et ici: http: // www. topherlee.com/software/pcm-tut-wavformat.html

Les fichiers .wav créés par Apple/OSX/macOS/iOS peuvent ajouter un bloc de remplissage `` FLLR '' à l'en-tête et augmenter ainsi la taille du RIFF d'en-tête initial de 44 octets à 4 000 octets (peut-être pour un meilleur alignement du disque ou du bloc de stockage du brut) exemples de données).

Le reste est très souvent un PCM linéaire 16 bits au format Little Endian à complément à 2 signé, représentant des échantillons arbitrairement mis à l'échelle à une fréquence de 44100 Hz.

Wave File Format

16
hotpaw2

Le fichier WAVE (.wav) contient un en-tête, qui indique les informations de formatage des données du fichier audio. Après l'en-tête se trouvent les données brutes audio réelles. Vous pouvez vérifier leur signification exacte ci-dessous.

Positions  Typical Value Description

1 - 4      "RIFF"        Marks the file as a RIFF multimedia file.
                         Characters are each 1 byte long.

5 - 8      (integer)     The overall file size in bytes (32-bit integer)
                         minus 8 bytes. Typically, you'd fill this in after
                         file creation is complete.

9 - 12     "WAVE"        RIFF file format header. For our purposes, it
                         always equals "WAVE".

13-16      "fmt "        Format sub-chunk marker. Includes trailing null.

17-20      16            Length of the rest of the format sub-chunk below.

21-22      1             Audio format code, a 2 byte (16 bit) integer. 
                         1 = PCM (Pulse code modulation).

23-24      2             Number of channels as a 2 byte (16 bit) integer.
                         1 = mono, 2 = stereo, etc.

25-28      44100         Sample rate as a 4 byte (32 bit) integer. Common
                         values are 44100 (CD), 48000 (DAT). Sample rate =
                         number of samples per second, or Hertz.

29-32      176400        (SampleRate * BitsPerSample * Channels) / 8
                         This is the Byte rate.

33-34      4             (BitsPerSample * Channels) / 8
                         1 = 8 bit mono, 2 = 8 bit stereo or 16 bit mono, 4
                         = 16 bit stereo.

35-36      16            Bits per sample. 

37-40      "data"        Data sub-chunk header. Marks the beginning of the
                         raw data section.

41-44      (integer)     The number of bytes of the data section below this
                         point. Also equal to (#ofSamples * #ofChannels *
                         BitsPerSample) / 8

45+                      The raw audio data.            

J'ai copié tout cela depuis http://www.topherlee.com/software/pcm-tut-wavformat.html ici

6
seanxiaoxiao

Comme d'autres l'ont souligné, il y a des métadonnées dans le fichier wav, mais je pense que votre question pourrait être, plus précisément, que signifient les octets (de données, pas de métadonnées)? Si c'est vrai, les octets représentent la valeur du signal qui a été enregistré.

Qu'est-ce que ça veut dire? Eh bien, si vous extrayez les deux octets (par exemple) qui représentent chaque échantillon (supposez un enregistrement mono, ce qui signifie qu'un seul canal de son a été enregistré), alors vous avez une valeur de 16 bits. En WAV, 16 bits est (toujours?) Signé et petit-boutien (AIFF, la réponse de Mac OS à WAV, est gros-boutiste, soit dit en passant). Donc, si vous prenez la valeur de cet échantillon 16 bits et que vous la divisez par 2 ^ 16 (ou 2 ^ 15, je suppose, si ce sont des données signées), vous vous retrouverez avec un échantillon qui est normalisé pour être dans la plage -1 à 1. Effectuez cette opération pour tous les échantillons et tracez-les en fonction du temps (et le temps est déterminé par le nombre d'échantillons/seconde dans l'enregistrement; par exemple, 44,1 KHz signifie 44,1 échantillons/milliseconde, de sorte que la première valeur d'échantillon sera tracée à t = 0, le 44e à t = 1 ms, etc.) et vous avez un signal qui représente approximativement ce qui a été enregistré à l'origine.

5
Pat

L'audio deux bits ne sonnerait pas très bien :) Le plus souvent, ils représentent des valeurs d'échantillon sous forme de nombres signés 16 bits qui représentent la forme d'onde audio échantillonnée à une fréquence telle que 44,1 kHz.

3
TJD

Je suppose que votre question est "Que représentent les octets dans le bloc de données du fichier .wav?" Faites-nous tout savoir systématiquement.
Prélude : Disons que nous jouons une onde sinusoïdale de 5KHz en utilisant un appareil et l'enregistrons dans un fichier appelé 'sine.wav', et l'enregistrement se fait sur un seul canal (mono). Vous savez maintenant ce que représente l'en-tête de ce fichier. Passons en revue quelques définitions importantes:

  • Échantillon: Un échantillon de n'importe quel signal signifie l'amplitude de ce signal au point où l'échantillon est prélevé . The sample at t=1.23 is taken where the amplitude is 0.94. Thus the sample value is 0.94
  • Taux d'échantillonnage: Beaucoup de ces échantillons peuvent être prélevés dans un intervalle de temps donné. Supposons que nous prenions 10 échantillons de notre onde sinusoïdale en 1 seconde. Chaque échantillon est espacé de 0,1 seconde. Nous avons donc 10 échantillons par seconde, donc la fréquence d'échantillonnage est de 10 Hz. Les octets 25 à 28 dans l'en-tête indiquent la fréquence d'échantillonnage.


Venons-en maintenant à la réponse à votre question:
Il n'est pas possible d'écrire pratiquement toute l'onde sinusoïdale dans le fichier car il y a des points infinis sur une onde sinusoïdale. Au lieu de cela, nous fixons un taux d'échantillonnage et commençons à échantillonner l'onde à ces intervalles et enregistrons les amplitudes. (Le taux d'échantillonnage est choisi de telle sorte que le signal puisse être reconstruit avec une distorsion minimale, en utilisant les échantillons que nous allons prendre. La distorsion dans le signal reconstruit en raison du nombre insuffisant d'échantillons est appelée "aliasing".)
Pour éviter le repliement, le taux d'échantillonnage est choisi pour être plus de deux fois la fréquence de notre onde sinusoïdale (5 kHz) (Ceci est appelé 'théorème d'échantillonnage' et le taux deux fois la fréquence est appelé "taux nyquist"). Ainsi, nous décidons d'aller avec un taux d'échantillonnage de 12 kHz, ce qui signifie que nous allons échantillonner notre onde sinusoïdale, 12000 fois en une seconde.
Une fois que nous commencerons l'enregistrement, si nous enregistrons le signal, qui est une onde sinusoïdale de fréquence de 5 kHz, nous aurons 12000 * 5 échantillons (valeurs). Nous prenons ces 60000 valeurs et les mettons dans un tableau. Ensuite, nous créons l'en-tête approprié pour refléter nos métadonnées, puis nous convertissons ces échantillons, que nous avons notés en décimal, en leurs équivalents hexadécimaux. Ces valeurs sont ensuite écrites dans les octets de données de nos fichiers .wav.

Terrain tracé sur: http://fooplot.com

1
Sushrut Kasture