Comment récupérer la durée d'un titre mp3 ?

voila je suis actuellement sur un projet de serveur audio, et j’aurai besoin de connaitre la durée d’une chanson afin de mettre a jour ma base de données…

comment on fait??

j’ai cherché partout sur le net !!

j’arrive a récupérer les tag id3v1, mais la durée n’est pas dedans…

faut faire un calcul en fonction du bitrate et de la taille des frames?
personne aurai une petite fonction qui prend en parametre un fichier mp3 et qui retourne la durée?

PS: je code en C.

y a surement des lib pour ça en C.
sinon à coder from scratch, ça a l’air possible:
http://www.mpgedit.org/mpgedit/mpeg_format/MP3Format.html

faut boucler sur toutes les frames en cherchant les 12 bits à 1 consécutifs et additonner les longues de chaque frame, tenant compte du bitrate.
:slight_smile:

Un de mes vieux code ici (en cours de réécriture), c’est en PureBasic, en gros, tu as 3 cas de figure :

  • mp3 cbr : suffit de récupérer la taille d’une frame dans le header mp3, donc le total_frames = (taille_du_fichier - taille_id_tag) / taille_de_la_trame,
  • mp3 vbri : il y a ce qu’il faut sur le site de fraunhofer pour lire le tag, s’il y en a un, total_frames = inclue dans le tag vbri,
  • mp3 vbr : calcul identique que le vbri, seul le header change.

A partir de la, tu as les infos nécéssaires au calcul de la durée mais il te faut aussi calculer :

  • le nombre de samples par trame : la, ça se trouve aussi dans le header mp3,
  • le taux d’échantillonnage : idem, dans le header,

donc :


total_samples = total_frames * samples_per_frame - (taille_donne_a_exclure) // taille_donne_a_exclure = idtag & co

Il ne reste plus qu’une bête conversion des samples en durée :


length = total_samples / sample_rate;

Je me suis servis de ça.

Merci, merci !!!
Je pense qu’avec ça, je vais pouvoir y arriver.
Le plus dur, ça va etre de récupérer la taille des tags v2, paske j’ai des petits soucis avec le big indian, ou le little indian !! (culé d’indien !! lol)
m’enfin voila je v regarder ça de plus pres…

http://www.clubic.com/forum/fwrite-en-c-bi…-c-t409289.html

Tu as fait l’erreur de bon nombres de codeur : on dit ENDIAN et pas INDIAN à savoir bouttiste et pas indien :smiley:
Pour la taille, c’est dans le code source donné dans le lien (facilement adaptable en C).

:MDR

:ouch: j’ai appris quelque chose, et je recoupe ça d’un coup avec les voyages de Gulliver:
http://www.traduc.org/pipermail/traduc/200…ust/000436.html
De mémoire, le peuple était scindé entre 2 populations en guerre: les petits boutiste et les gros boutistes (ou boutiens?): qui ouvraient leur oeuf coque par le petit, ou par le gros bout. :smiley:
j’en déduit que ces stupide ingénieurs d’intel ouvrent leur oeuf coque par le petit bout, ce qui est une aberration bien sûr :grrr:
:ane:

c’est un super clin d’oeil, ça mériterait presque un article sur wikipedia.

c’est déjà le cas :wink:
http://fr.wikipedia.org/wiki/Endianness

L’Endian fait effectivement référence aux voyages de Gulliver :wink:

Bon, bah ça y est, j’ai réussi,
en fait j’ai trouvé sur internet que chaque frame s’un mp3 avait une durée de 0.026 secondes, et donc j’ai lu l’entete d’une frame pour savoir quele taille elle faisai, puis je me déplacais jusu’a la suivante, et ainsi de suite, j’usqua la fin du fichier ou k’on lise un tag id3v1 (les 128 derniers octets).
Enfin je multiplie le nb de frames obtenu par 0.026 (+1, pour arrondir), et ça marche :sol:

Ce que tu as lu n’est valable que pour les MP3 CBR (bitrate constant) donc comme je l’ai dit dans ce cas, tu n’as pas besoin de lire chaque frame, juste la première et le deuxième pour vérifier qu’elles sont identiques ce qui doit être le cas pour du CBR.
De la, tu n’as plus qu’a calculer le nombre de trame suivant la taille du fichier, pas besoin de parser tout le fichier.

Non, mon algo marche aussi avec de bitrate variable…
puiske chaque frame fait 0.026 secondes, c’est sa taille en octets qui varie en fonction du bitrate… c’est ce que je calcule pour chaque frame en lisant les 4 bits du bitrate et les 2 bits de fréquence…
M’enfin, ça marche, alors je croise les doigts pour que ça marche tt le temps
je v faire des tests aujourd’hui…
pis faut ke je fasse la meme pour les fichiers “.ogg” …

voila bonne journée !!

J’ai trouvé pas mal d’information intéressante dans ce forum. J’aurais aimé trouver aussi le code source …
Je cherche un code le plus simple possible pour récupérer la durée d’un fichier mp3 (et rien d’autre), en PHP de préférence. J’ai trouvé du code source et executable ici: www.codeproject.com… et il est en C++. Je vais essayer de le transformer en PHP pour la partie qui m’intéresse
Edité le 26/10/2008 à 11:43

Merci !

J’avais vu le code mais je n’ai pas suffisamment de connaissance pour faire la translation vers PHP

Juste pour information: finalement j’ai trouvé un code PHP tout fait: www.phpclasses.org…
Avec un petit code comme:

require_once(“classAudioFile.php”);
$fileName = “nom du fichier.mp3”;
$mp3 = new AudioFile();
$mp3->loadFile($fileName);
$mp3->printSampleInfo();

on peut l’utiliser sans effort
Edité le 27/10/2008 à 21:09