Un débit MP3 supérieur à 320 kbps ?
Dans le milieu des techniciens audiophiles, une légende raconte que le format MPEG 1 Audio Layer III pourrait monter au dessus de 320 kbps. Quelle est donc cette diablerie ? 🪄
Le déni 🙅
Après un refus catégorique de croire en cette affirmation, sous le prétexte que j'avais déjà eu à développer un parseur de frame MP3 et que les débits fixes sont prédéterminés dans la norme et que ça ne dépasse par 320, j'ai fait quand même quelques recherches.
Un MP3 est au niveau bitstream une succession de frames MP3, composées d'un MP3 Header + un payload. Le header est composé de 32 bits et voici sa structure :
La norme est claire, dans l'entête, 4 bits sont réservés à la définition du débit, avec un tableau de correspondance de ce type :
1/**
2 * Correspondance bitrate (valable pour MPEG 1 Layer III seulement)
3 * représentation binaire => débit en kbps
4 *
5 * @var array<int,int|null>
6 */
7public static $bitRatesIndex = [
8 0x0 => null,
9 0x1 => 32,
10 0x2 => 40,
11 0x3 => 48,
12 0x4 => 56,
13 0x5 => 64,
14 0x6 => 80,
15 0x7 => 96,
16 0x8 => 112,
17 0x9 => 128,
18 0xA => 160,
19 0xB => 192,
20 0xC => 224,
21 0xD => 256,
22 0xE => 320,
23 0xF => null,
24];
Alors d'où vient ce théorique débit supérieur ?
Le format débridé 🚀
La page Wikipedia du MP3 (uniquement la version anglaise) donne un premier indice sur ce mode mystérieux :
Non-standard bit rates up to 640 kbit/s can be achieved with the LAME encoder and the free format option, although few MP3 players can play those files.
Les toujours bien informés spécialistes du forum Hydrogen Audio résument la situation :
Simple version: Free-format simply means that the bitrate is non-standard. Anything from 1 to 640kbps. Most players can't deal with free-format mp3's.
On voit bien ce commit de mai 2000 de lame
ajoutant cette option :
1--freeformat produce a free format bitstream. User must also specify
2 a bitrate with -b, between 8 and 320 kbs.
Alors ok, le mode existe bien. Maintenant, mettons le à l'épreuve du feu 🔥
Encodage / Décodage 🏋️
Testons l'encodage avec lame
le seul capable de générer ce fameux freeformat
.
1lame --freeformat -b 640 media.wav freeformat-640.mp3
2LAME 3.100 64bits (http://lame.sf.net)
3Using polyphase lowpass filter, transition band: 20323 Hz - 20903 Hz
4Warning: many decoders cannot handle free format bitstreams
5Warning: many decoders cannot handle free format bitrates >320 kbps (see documentation)
6Encoding media.wav to freeformat-640.mp3
7Encoding as 48 kHz j-stereo MPEG-1 Layer III (4.8x) 640 kbps qval=3
8 Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
9149995/149995(100%)| 0:28/ 0:28| 0:28/ 0:28| 128.31x| 0:00
10-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
11 kbps LR MS % long switch short %
12 640.0 9.0 91.0 88.8 6.0 5.3
13Writing LAME Tag...done
14ReplayGain: -7.4dB
Des avertissements précisent la compatibilité restreinte !
Maintenant lisons le ficher généré avec mpv
:
1mpv freeformat-640.mp3
2Failed to recognize file format.
3Exiting... (Errors when loading file)
Mauvais signe, alors au moins analysons le avec l'outil tout terrain mediainfo
:
1mediainfo freeformat-640.mp3
2General
3Complete name : freeformat-640.mp3
4File size : 137 MiB
Et enfin ffprobe
1ffprobe -hide_banner freeformat-640.mp3
2[mp3 @ 0x12b6068b0] Format mp3 detected only with low score of 1, misdetection possible!
3[mp3float @ 0x12b606ff0] Header missing
4 Last message repeated 39 times
5Input #0, mp3, from 'freeformat-640.mp3':
6 Duration: 00:59:59.88, start: 0.023021, bitrate: 640 kb/s
7 Stream #0:0: Audio: mp3 (mp3float), 32000 Hz, stereo, fltp, 32 kb/s
8 Metadata:
9 encoder : LAME3.100
10 Side data:
11 replaygain: track gain - -7.400000, track peak - unknown, album gain - unknown, album peak - unknown,
Essayons de le décoder avec lame
1lame --decode freeformat-640.mp3 freeformat-640.wav
2Input file is freeformat.
3input: freeformat-640.mp3 (48 kHz, 2 channels, MPEG-1 Layer III)
4output: freeformat-640.wav (16 bit, Microsoft WAVE)
5skipping initial 1105 samples (encoder+decoder delay)
6skipping final 47 samples (encoder padding-decoder delay)
7Frame#149995/149995 640 kbps MS
Là, le décodage a pu se faire, écoutons la version décodée
1mpv freeformat-640.wav
2● Audio --aid=1 (pcm_s16le 2ch 48000 Hz 1536 kbps)
3AO: [coreaudio] 48000Hz stereo 2ch s16
4A: 00:25:11 / 00:59:59 (42%)
5Exiting... (Quit)
Oui c'est bon, on peut (heureusement) relire notre fichier.
Conclusion 🏁
N'utilisez pas ce hack freeformat
, il est non standard, vieux, avec perte, compatible avec rien. Utilisez plutôt des codecs comme FLAC si vous voulez du lossless, ou AAC et ses dérivés modernes pour une compression avec perte.