Page 1 sur 3

tags des fichiers audio

Publié : lun. 07/juin/2010 15:38
par Parole De JOJO
Bonjour

je sais que j'ai deja pose la question ici, mais comme je n'ai pas compris la reponse, je me permet de la reformuler

je cree un programme qui gere les tags des fichiers audio, tel que nom d'artiste, d'album etc
le probleme c'est comment manipuler ces details. on m'a conseille la librairie tag lib, mais je n'ai pas compris quoi en faire. sur le forum anglais quelqun a mis un exemple qui ne marche pas apparement avec la version de tag lib telechargeable, et je suis completement confus.

si quelqun pourrait me donner un petit exemple (je ne demande pas qu'on me mache le boulot, juste un petit exemple), je lui en serais tres recconnaissant

merci

Re: tags des fichiers audio

Publié : lun. 07/juin/2010 17:02
par Ar-S
Donne un lien vers cette lib stp

Re: tags des fichiers audio

Publié : lun. 07/juin/2010 17:28
par Parole De JOJO

Re: tags des fichiers audio

Publié : lun. 07/juin/2010 18:00
par Ar-S
Je ne vois pas trop en quoi cette lib est compatible PB mais j'ai une solution trouvé sur codeArchive :

Code : Tout sélectionner

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=1350&highlight=
; Author: Momo (corrected by J-The-Grey, updated for PB4.00 by blbltheworm)
; Date: 14. June 2003
; OS: Windows
; Demo: Yes

OpenWindow(1,12,12,300,250,"ID3 Infos:",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) 

AboutText.s="Programmer: Moritz Wagner" + Chr(13) + Chr(13) + Chr(169) + " 2003 by Moritz Wagner"+Chr(13)+"Programmed in Pure Basic" + Chr(13) + Chr(13) + "Contact: Wagnergitti@vr-web.de" 

File.s=OpenFileRequester("Bitte Wählen sie eine MP3 Datei aus die ID3 V1 Tags enthält","","MP3 Tracks (*.MP3)|*.mp3;Alle (*.*)|*.*",0) 
If File<>"" 
  If ReadFile(0,File) 
    MemPointer =  AllocateMemory(128) ; 128 byte reservieren
    If  MemPointer
      FileSeek(0,Lof(0)-128) 
      ReadData(0,MemPointer, 128) ; die letzten 128 byte der Datei auslesen 
      ; Debug mempointer 
      CloseFile(0) 
      header$    = PeekS(MemPointer, 3) 
      
      If header$ = "TAG"                               ;  3 Zeichen 
        songtitle$ = Trim(PeekS(MemPointer +   3,30)) ; 30 Zeichen 
        artist$    = Trim(PeekS(MemPointer +  33,30)) ; 30 Zeichen 
        album$     = Trim(PeekS(MemPointer +  63,30)) ; 30 Zeichen 
        year$      = Trim(PeekS(MemPointer +  93, 4)) ;  4 Zeichen 
        comment$   = Trim(PeekS(MemPointer +  97,30)) ; 30 Zeichen 
        genre      = PeekB(MemPointer + 127)          ;  1 Zeichen 
        CreateGadgetList(WindowID(1)) 
        TextGadget(7,10,10,80,20,"Titel:") 
        TextGadget(8,10,40,80,20,"Künstler: ") 
        TextGadget(9,10,70,80,20,"Album: ") 
        TextGadget(10,10,100,80,20,"Jahr: ") 
        TextGadget(11,10,130,80,20,"Kommentar: ") 
        TextGadget(12,10,160,80,20,"Genre: ") 
        StringGadget(0,80,10,200,20,songtitle$) 
        StringGadget(1,80,40,200,20,artist$) 
        StringGadget(2,80,70,200,20,album$) 
        StringGadget(3,80,100,200,20,year$) 
        StringGadget(4,80,130,200,20,comment$) 
        StringGadget(5,80,160,200,20,Str(genre)) 
        ButtonGadget(6,20,190,70,30,"About") 
        ButtonGadget(13,120,190,70,30,"OK") 
      EndIf 
    EndIf 
  EndIf 
Else 
  MessageRequester("Error","Bitte Wählen Sie eine MP3 Datei aus!",0) 
EndIf 

Repeat 
  eventid = WaitWindowEvent() 
  If eventid = #PB_Event_CloseWindow 
    Ende=1 
  EndIf 
  If eventid = #PB_Event_Gadget 
    If EventGadget()=6 
      MessageRequester("About",AboutText,OK) 
    EndIf 
    If EventGadget()=13 
      songtitle.s=GetGadgetText(0) 
      artist.s=GetGadgetText(1) 
      album.s=GetGadgetText(2) 
      year.s=GetGadgetText(3) 
      comment.s=GetGadgetText(4) 
      genre=Val(GetGadgetText(5)) 
      
      
      If OpenFile(0,File)
        MemPointer = AllocateMemory(128)
        If MemPointer
          FileSeek(0,Lof(0)-128) 
          PokeS(MemPointer,header$, 3) 
          ;  3 Zeichen 
          PokeS(MemPointer+3,songtitle.s,30) ; 30 Zeichen 
          PokeS(MemPointer+33,artist.s,30) ; 30 Zeichen 
          PokeS(MemPointer+63,album.s,30) ; 30 Zeichen 
          PokeS(MemPointer+93,year.s,4) ;  4 Zeichen 
          PokeS(MemPointer+97,comment.s,30) ; 30 Zeichen 
          PokeB(MemPointer + 127,genre)          ;  1 Zeichen 
          
          WriteData(0,MemPointer, 128) 
          CloseFile(0) 
          ;     Debug songtitle 
          
        EndIf 
      EndIf 
    EndIf 
  EndIf 
Until Ende=1 
End 

; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
; EnableXP

A toi de l'examiner et de l'adapter pour tes besoin mais j'ai testé et ça marche. (j'ai modifié le tag d'un morceau)

Re: tags des fichiers audio

Publié : mar. 08/juin/2010 11:36
par Parole De JOJO
Merci effectivement ca marche mais pas pour les fichiers wma. de plus j'ai reussi seulement a lire les tags et pas a les ecrire

Re: tags des fichiers audio

Publié : mar. 08/juin/2010 15:35
par Ar-S
=> je pesais que tu voulais que tagguer des mp3... Les autres formats .. mystère.

sinon pour l'écriture, as tu essayé d'ouvrir un fichier mp3 avec le programme, de modifier un des champs puis de le fermer.
ensuite en ré-ouvrant tu t'apercevras que le contenu du champ a bien été gardé. En tout cas ça a fonctionné pour moi.

Re: tags des fichiers audio

Publié : mar. 08/juin/2010 18:56
par Parole De JOJO
oui j'ai fais cela et ca n'a pas marche
je suis sous win 7 peut etre que c'est un probleme. si j'ai bien compris il y a un trus qui s'apelle id3 qui a change
avant c'etait id1 et id2. donc il faut un code de id3. sur celui que tu m'as mis c'ect ecrit id1 je crois

bref je suis desespere :)

Re: tags des fichiers audio

Publié : mer. 09/juin/2010 4:08
par Geo Trouvpatou
Salut.

Tu trouveras peut-être ton bonheur ici : http://fr.wikipedia.org/wiki/ID3

Regardes bien le 1er tableau : Structure des métadonnées ID3v1

0_____3____Identifiant "TAG" <- Le Header
3____30____Titre de la chanson
33___30____Nom de l'interprète
63___30____Nom de l'album
93____4____Année de parution
97___30____Commentaire sur la chanson
127___1____Genre musical



Maintenant regardes le code :

header$ = PeekS(MemPointer, 3)
If header$ = "TAG" ; 3 Zeichen

songtitle$ = Trim(PeekS(MemPointer + 3,30)) ; 30 Zeichen
artist$ = Trim(PeekS(MemPointer + 33,30)) ; 30 Zeichen
album$ = Trim(PeekS(MemPointer + 63,30)) ; 30 Zeichen
year$ = Trim(PeekS(MemPointer + 93, 4)) ; 4 Zeichen
comment$ = Trim(PeekS(MemPointer + 97,30)) ; 30 Zeichen
genre = PeekB(MemPointer + 127) ; 1 Zeichen


Pour simplifier, imagines que ton "Header" démarre à 0 et qu'il prend 3 octets (3 cases mémoire : 0,1,2), donc la prochaine valeur "Titre de la chanson" sera 3 et prend 30 octets etc...
Bref! les valeurs s'additionnent en fonction de la place qu'elle prend mémoire pour trouver la valeur suivante.

Les tags se trouvent à la fin du fichier et prennent 128 octets de place, c'est pour cela qu'il y a cette ligne : FileSeek(0,Lof(0)-128)
Par rapport à la fin du fichier, on recule pour trouver le "T" de TAG.
Si tu as du mal à comprendre, lis la procedure FileSeek.

Les Peeks te permettent de récupérer les valeurs, les Pokes eux te permettent de modifier ces valeurs.

Le code chez moi fonctionne pour les mp3.
Pour les wma, c'est une autre histoire.

[EDIT]D'ailleurs en lisant moins entre les lignes du côté de wikipedia, j'ai perdu mon temps à t'expliquer un truc pour rien :
Wikipédia a écrit :Elle consiste en un espace de 128 octets placés à la fin du fichier. Les 3 premiers octets commencent par la chaîne « TAG », cela permet de trouver le début des informations par les lecteurs MP3. Le reste des octets est partagé entre les différents champs d'informations.
[EDIT2]Ce programme n'a pas marché pour un autre mp3, donc je l'ai ouvert avec un éditeur Hexa, et il n'y avait aucunes infos, j'ai donc ajouté moi-même le "TAG" et derrière un titre bidon.
Ensuite le programme cette fois-ci, à bien ouvert le fichier mp3 et lu les infos du titre.

Re: tags des fichiers audio

Publié : mer. 09/juin/2010 10:59
par Backup
Geo Trouvpatou a écrit : [EDIT2]Ce programme n'a pas marché pour un autre mp3, donc je l'ai ouvert avec un éditeur Hexa, et il n'y avait aucunes infos, j'ai donc ajouté moi-même le "TAG" et derrière un titre bidon.
Ensuite le programme cette fois-ci, à bien ouvert le fichier mp3 et lu les infos du titre.

il suffit donc, de tester la présence de "TAG" , et de faire selon :)

Re: tags des fichiers audio

Publié : mer. 09/juin/2010 12:00
par Parole De JOJO
super. j'ai compris comment lire les tags

mais je n'arrive toujours pas a les ecrire

Re: tags des fichiers audio

Publié : mer. 09/juin/2010 12:30
par Progi1984
Juste pour infos, tu as la lib id3Lib (http://code.google.com/p/rwrappers/wiki/RWid3Lib)
avec son wrapper et les exemples (http://code.google.com/p/rwrappers/sour ... unk/id3Lib)

Re: tags des fichiers audio

Publié : mer. 09/juin/2010 17:32
par Geo Trouvpatou
Dobro a écrit :il suffit donc, de tester la présence de "TAG" , et de faire selon :)
Exactement et c'est d'ailleurs ce qui est fait avec le : If header$ = "TAG" ,mais c'est le programme qui est mal foutu, puisque que l'interface se dessine correctement uniquement si le mot TAG est présent, mais quand ce n'est pas le cas alors on n'entre pas dans la condition et donc l'interface ne se dessine pas et cela donne l'impression que le programme est bloqué.
Parce que mieux conçu, sur un fichier non taggué, on pourrait ajouter nos infos.

Pour modifier les infos Jojo, c'est pareil que les lire.
Voici le code :

Code : Tout sélectionner

If OpenFile(0,File)
        MemPointer = AllocateMemory(128)
        If MemPointer
          FileSeek(0,Lof(0)-128)
          PokeS(MemPointer,header$, 3) ;  3 Zeichen
          PokeS(MemPointer+3,songtitle.s,30) ; 30 Zeichen
          PokeS(MemPointer+33,artist.s,30) ; 30 Zeichen
          PokeS(MemPointer+63,album.s,30) ; 30 Zeichen
          PokeS(MemPointer+93,year.s,4) ;  4 Zeichen
          PokeS(MemPointer+97,comment.s,30) ; 30 Zeichen
          PokeB(MemPointer + 127,genre)          ;  1 Zeichen
         
          WriteData(0,MemPointer, 128)
          CloseFile(0)
          ;     Debug songtitle
         
        EndIf 
EndIf 
On calcul le nombre d'octets total du Mp3 grâce à Lof (Voir doc).
Comme on sait que les tags sont stockés à la fin du fichier sur une longueur de 128 octets on prend donc : Taille totale du fichier - 128 octets grâce à : Lof(0)-128
On sait qu'au début on doit avoir le mot TAG.
En sachant qu'un caractère prend 1 octet donc TAG = 3 caractères = 3 octets d'où
PokeS(MemPointer,header$, 3)
Actuellement header$ vaut TAG, mais tu aurais pu aussi coder en dur comme ceci :
PokeS(MemPointer,"TAG", 3)
Cela aurait donné le même résultat.
Et étant donné que les 1ère infos sont du texte (String) on utilise PokeS.

Quand on lit Wikipédia, pour la dernière info il est dit :
Les différents genre musicaux sont définis par une valeur numérique de 0 à 79. Le logiciel Winamp a étendu cette liste jusqu'à 147.
C'est pour cela que cette fois-ci pour la dernière donnée, on met : PokeB

Avec Peek (Moyen mnémotechnique : Tu PIQUEs la valeur) tu récupères une valeur en mémoire, avec Poke tu modifies une valeur en mémoire.

Mais plutôt que de te casser la tête utilise le wrapper de Progi1984.

Re: tags des fichiers audio

Publié : jeu. 10/juin/2010 11:37
par Parole De JOJO
merci beaucoup les gars, j'ai presque tout compris

en fait la premiere version de id3 stockait les tags dans les 128 deniers bits du fichier mp3.
la deuxieme version stock au debut et sans limite de taille.
donc on fait une verification si le fichier commence par id3 c'est la 2eme version et si a la fin il y a TAG c'est la 1ere

pour changer les tags a la fin, c'est tres facile, il y a juste a remplacer les derniers 128 bits

le mystere est comment remplacer les tags dans la deuxieme version, et comme aujourd'hui tout est dans la 2eme (en tout cas dans win 7), il faut trouver une solution. le probleme est que puisque les tags n'ont pas une longueur predefini et de plus ne sont pas dand un ordre predefini, il faut donc trouver une astuce pour les gerer. (en effet, dans la 2eme version, pour entrer le nom de l'album par exemple on met tout simplement TALM (ou qqchose comme ca), suivi d'un signe bizzarre suivi du nom de l'album.

bref, en fait les tags sont facilement voyables en ouvrant le fichier mp3 dans notepad, l'editeur de texte

bon, si qqelqun a une idee, il serait gentil de m'en faire participer

Re: tags des fichiers audio

Publié : jeu. 10/juin/2010 12:12
par Ar-S
J'ai ouvert à mp3 avec un editeur hexadécimal.
Le fichier commence comme ça :

Code : Tout sélectionner

4944330300000001135D434F4D4D000048C8000001656E67FFFE0000FFFE
ceci est suivi du commentaire qui lui peut être très long.
puis une autre série en hexa

Code : Tout sélectionner

00760054414C4200000029000001FFFE
etc...

On observe que chaque fin de champ se termine par [FF FE] sauf le dernier qui est [FF FB]
ceci sont précédés par d'autres valeur hexa et par des mots clés comme TCOP pour copyright, TYER pour Year etc...
Donc je me dis que ce qui compte ce n'est pas forcément le nombre de caractères mais ces valeurs hexa et ces mots clés qui déterminent la taille des champs. (champ auteur, champ commentaire etc..)

C'est unidée à creuser je pense.

Re: tags des fichiers audio

Publié : jeu. 10/juin/2010 16:18
par Parole De JOJO
ca a l'air une bonne idee, mais comment utiliser cette info?

de plus je ne comprends pas comment changer les tags, puisqu'ils ne suivent pas un ordre predefinis, et donc comment dire a mon programme quoi lire?

la wrapper de progi1984 a l'air interressante mais je n'ai pas reussi a l'utiliser. un message d'erreur s'affiche