J'avais l'habitude de calculer la durée des fichiers MP3 côté serveur en utilisant ffmpeg - qui semblait bien fonctionner. Aujourd'hui, j'ai découvert que certains calculs étaient faux. D'une manière ou d'une autre, pour une raison quelconque, ffmpeg calculera mal la durée, ce qui semble se produire uniquement avec les fichiers mp3 à débit binaire variable.
Lors du test local, j’ai remarqué que ffmpeg imprimait deux lignes supplémentaires en vert.
Commande utilisée:
ffmpeg -i song_9747c077aef8.mp3
ffmpeg dit:
[mp3 @ 0x102052600] max_analyze_duration 5000000 reached at 5015510
[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate
Après une session Google agréable et chaleureuse, j’ai découvert quelques articles à ce sujet, mais aucune solution n’a été trouvée.
J'ai ensuite essayé d'augmenter la durée maximale:
ffmpeg -analyzeduration 999999999 -i song_9747c077aef8.mp3
Après cela, ffmpeg n'a renvoyé que la deuxième ligne:
[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate
Mais dans les deux cas, la durée calculée était tout simplement fausse. En le comparant à VLC, j'ai remarqué que la durée est correcte.
Après plus de recherches, je suis tombé sur mp3info - que j'ai installé et utilisé.
mp3info -p "%S" song_9747c077aef8.mp3
mp3info a ensuite renvoyé leCORRECTdurée, mais uniquement sous forme d’entier, que je ne peux utiliser car j’ai besoin d’un nombre plus précis ici. La raison en est expliquée dans un commentaire ci-dessous, par l'utilisateur blahdiblah - mp3info extrait simplement les informations ID3 du fichier sans effectuer de calcul.
J'ai aussi essayé d'utiliser mplayer pour récupérer la durée, mais tout comme ffmpeg, mplayer renvoie la mauvaise valeur.
J'ai finalement trouvé une solution appropriée à ce problème en utilisant sox - qui renvoie les informations correctes.
sox file.mp3 -n stat
Samples read: 19321344
Length (seconds): 219.062857
Scaled by: 2147483647.0
Maximum amplitude: 1.000000
Minimum amplitude: -1.000000
Midline amplitude: -0.000000
Mean norm: 0.141787
Mean amplitude: 0.000060
RMS amplitude: 0.191376
Maximum delta: 0.947598
Minimum delta: 0.000000
Mean delta: 0.086211
RMS delta: 0.115971
Rough frequency: 4253
Volume adjustment: 1.000
Durée (secondes): 219.062857
Vous pouvez complètement décoder le fichier pour obtenir la durée réelle:
ffmpeg -i input.mp3 -f null -
L'avant-dernière ligne de la sortie de la console affiche quelque chose comme:
size=N/A time=00:03:49.12 bitrate=N/A
Où time
est la durée réelle. Dans cet exemple, le processus entier a pris environ 0,5 seconde.
Solution extensible de LordNeckbeard. Pour obtenir uniquement des statistiques, vous pouvez ajouter des drapeaux -v quiet -stats
ffmpeg -v quiet -stats -i input.mp3 -f null -