web-dev-qa-db-fra.com

Comment obtenir la durée réelle d'un fichier MP3 (VBR ou CBR) côté serveur

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.

21
SquareCat

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

20
SquareCat

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

time est la durée réelle. Dans cet exemple, le processus entier a pris environ 0,5 seconde.

10
llogan

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 - 
1
Mitja Gomboc