Page 3 sur 3

Re: tags des fichiers audio

Publié : dim. 20/juin/2010 21:12
par Ar-S
Sans avoir testé le code, essaye Bin(TagTailleBin)

Re: tags des fichiers audio

Publié : lun. 21/juin/2010 7:06
par Parole De JOJO
ca ne marche pas

Re: tags des fichiers audio

Publié : lun. 21/juin/2010 11:56
par boddhi

Code : Tout sélectionner

Procedure BinVal(a$); - Convert a String in binary-format in numeric value
  a$=Trim(UCase(a$))
  If Asc(a$)='%'
    a$=Trim(Mid(a$,2,Len(a$)-1))
  EndIf
  Result=0
  *adr.Byte=@a$
  For i=1 To Len(a$)
    Result<<1
    Select *adr\b
      Case '0'
      Case '1':Result+1
      Default:i=Len(a$)
    EndSelect
    *adr+1
  Next
  ProcedureReturn Result
EndProcedure

Re: tags des fichiers audio

Publié : sam. 26/juin/2010 20:24
par Parole De JOJO
merci beaucoup

la fonction marche et donne une valeur qui est un peu plus grande que le tag mais jamais plus petite et jamais dans le chant

Re: tags des fichiers audio

Publié : lun. 28/juin/2010 10:25
par boddhi
la fonction marche et donne une valeur qui est un peu plus grande que le tag mais jamais plus petite et jamais dans le chant
Comment ça ??? 8O
J'ai moi-même codé un lecteur de tag et la taille retournée a toujours été exacte !!!
As-tu un exemple concrêt ???

Re: tags des fichiers audio

Publié : mar. 29/juin/2010 14:18
par Parole De JOJO
en fait je pense que ca va

plutot que de me casser la tete a changer le tag, j'ai pese a l'effacer et le reecrire

le probleme est que je perd l'image
comment recuperer l'image qui est inclu dans le tag

Re: tags des fichiers audio

Publié : mar. 29/juin/2010 23:24
par boddhi
plutot que de me casser la tete a changer le tag, j'ai pese a l'effacer et le reecrire

le probleme est que je perd l'image
Bah, c'est normal :roll: :roll:

Il n'y a que 2 façons de modifier les tags :
  • La manière propre qui consiste à réécrire entièrement le fichier MP3 en modifiant le(s) tag(s) voulu(s)
  • La manière barbare qui consiste à remplacer la valeur originelle par une autre valeur. Dans ce cas-là, il faut IMPÉRATIVEMENT respecter la longueur de la valeur de la chaîne originelle ainsi que son format ASCII ou UNICODE. Si, par exemple, tu souhaites modifier le tag TIT2 qui a pour valeur ASCII "Titre1" qui comporte donc 6 caractères, la nouvelle chaîne doit faire exactement 6 caractères. Si sa longueur est inférieure, tu complètes avec autant d'octets $00 que nécessaire, si elle est égale, tant mieux, si elle est supérieure, utilises la fonction Left()
Maintenant, le plus propre consiste à stocker ce qui est écrit jusqu'au tag que l'on veut modifier, calculer la taille de la chaîne (bases-toi, pour cela, sur le modèle de calcul que j'ai fourni dans mon code), écrire le tag modifié puis ce qu'il y avait après le tag à modifier. En gros, comme pour un bouquin, tu veux modifier tout le chapitre 2, tu écris tout ce qu'il y avait avant ce chapitre, tu modifies le chapitre 2 et puis tu continues avec tout ce qu'il y avait après le chapitre 2. Si tu réécris ton chapitre avec un nombre de pages différentes, tu penseras évidemment à modifier le n° des pages et toutes les informations s'y rapportant dans l'index, ... Et bien, avec ton MP3 et ton tag ID3, tu le fais en modifiant la valeur du champ taille du tag et de l'en-tête ID3v2... (Attention : ça marche pas comme ça pour tous les types de fichiers :D :D , surtout avec ce :twisted: de jpg... :D )

Pour lire l'image, si vraiment tu n'y arrives pas, j'essaierai de retrouver mon code... mais là, franchement, il est tard et je dois me lever très tôt... :lol:
Il faudra juste me préciser si tu lis le fichier à partir du disque ou si tu charges l'en-tête en mémoire...

Re: tags des fichiers audio

Publié : mer. 30/juin/2010 7:11
par Parole De JOJO
si tu trouve a l'occas le code pour l'image ce serait sympa

je pense que je lis en memoire mais je sais pas si ca change qqchose

merci

Re: tags des fichiers audio

Publié : jeu. 01/juil./2010 0:36
par boddhi
Ci-dessous, le code qui devrait répondre à ton besoin.
Comme le tien plus haut utilise des accès physiques réguliers au fichier, j'en ai fait de même.
Une autre méthode consiste à charger l'en-tête entier en mémoire et à travailler uniquement avec des déplacements en mémoire.
C'est un peu plus complexe à coder mais (un petit peu) plus rapide en exécution...

Attention, la procédure Fc_LireFrameAPIC() est à répéter autant de fois qu'il y a de tags APIC dans l'en-tête ID3v2.
En effet, il peut y avoir plusieurs types d'images => voir procédure Fc_TypeImage()

Code : Tout sélectionner

; ****
; **** Lecture Frame APIC En-tête ID3v2
; **** Auteur : Boddhi           
; ****

EnableExplicit
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseJPEG2000ImageDecoder()

Enumeration ; Fenêtres
  #FENETRE
EndEnumeration
Enumeration ; Gadgets
  #TitCpMP3
  #CpMP3
  #TitDescription
  #CpDescription
  #TitType
  #CpType
  #ImgAPIC
EndEnumeration
Enumeration ; Images
  #Image1
EndEnumeration

Procedure.f Fc_MinF(ArgNombre1.f,ArgNombre2.f)
  If ArgNombre1>ArgNombre2:ProcedureReturn ArgNombre2:Else:ProcedureReturn ArgNombre1:EndIf
EndProcedure

Procedure.s Fc_TypeImage(ArgTypeImage.i)
  Define.s Chaine
  Select ArgTypeImage
    Case $00:Chaine="Autre"
    Case $01:Chaine="Icône PNG 32x32"
    Case $02:Chaine="Autre fichier icône"
    Case $03:Chaine="Jaquette avant"
    Case $04:Chaine="Jaquette arrière"
    Case $05:Chaine="Feuillet intérieur"
    Case $06:Chaine="Média"
    Case $07:Chaine="Soliste/Responsable graphique" ; Lead artist/Lead performer/soloist
    Case $08:Chaine="Artiste/Interprète"
    Case $09:Chaine="Chef d'orchestre"
    Case $0A:Chaine="Groupe/Orchestre"
    Case $0B:Chaine="Compositeur"
    Case $0C:Chaine="Parolier"
    Case $0D:Chaine="Lieu d'enregistrement"
    Case $0E:Chaine="Durée d'enregistrement"
    Case $0F:Chaine="Durée du concert"
    Case $10:Chaine="Capture vidéo"
    Case $11:Chaine="Poisson coloré lumineux" ; => ???? => Sont fous ces anglo-saxons !!!
    Case $12:Chaine="Illustration"
    Case $13:Chaine="Logo artiste/groupe"
    Case $14:Chaine="Logo studio/maison d'édition"
    Default:Chaine="Type inconnu"
  EndSelect
  ProcedureReturn Chaine
EndProcedure

Procedure.i Fc_LireFrameAPIC(ArgNofichier.i,ArgNomFichier.s)
  Define.i Position   ; Position 0 du tag APIC dans le fichier
  Define.i TagTaille,TagFlag,TailleChaine,Resultat,NoImage,TailleMemImage,TailleImageX,TailleImageY
  Define.b Unicode,TagTypeAPIC
  Define.i *Tampon
  Define.s TagNom,TagDescAPIC,TagDescImage
  Define.f Ratio

  Position=Loc(ArgNofichier)
  ; **** Lecture En-tête Tag ****
  *Tampon=AllocateMemory(10)
  ReadData(ArgNofichier,*Tampon,10)
  TagNom=PeekS(*Tampon,4,#PB_Ascii)
  If UCase(TagNom)<>"APIC"
    Resultat=#False
    Goto Fc_LireFrameAPIC_Fin
  EndIf
  TagTaille=PeekL(*Tampon+4)
  TagTaille=((TagTaille&$FF)<<24)+((TagTaille&$FF00)<<8)+((TagTaille&$FF0000)>>8)+((TagTaille>>24)&$FF)
  TagFlag=PeekB(*Tampon+8)<<8+PeekB(*Tampon+9)
  FreeMemory(*Tampon)
  ; Lecture Description Image
  Unicode=ReadByte(ArgNofichier)
  Position=Loc(ArgNofichier)
  *Tampon=AllocateMemory(64)
  ReadData(ArgNofichier,*Tampon,64)
  TagDescAPIC=PeekS(*Tampon,64*(Unicode+1),#PB_Ascii+Unicode)
  If TagDescAPIC="-->"
    TagTypeAPIC=0
    TagDescImage="Lien URL"
    ; ==> Code à compléter => J'ai jamais eu un type de genre sous la main pour tester
  Else
    Position+Len(TagDescAPIC)*(Unicode+1)+1
    FileSeek(ArgNofichier,Position)
    TagTypeAPIC=ReadByte(ArgNofichier)&$FF
    TagDescImage=Fc_TypeImage(TagTypeAPIC)
    ; Capture Image
    Position+2
    FileSeek(ArgNofichier,Position)
    FreeMemory(*Tampon)
    TailleMemImage=TagTaille;-Position
    *Tampon=AllocateMemory(TagTaille)
    ReadData(ArgNofichier,*Tampon,TagTaille)
    Resultat=CatchImage(NoImage,*Tampon,TagTaille,#PB_Image_DisplayFormat)
    
    If Resultat
      If OpenWindow(#FENETRE,220,0,410,479,"APIC",#PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
        If CreateGadgetList(WindowID(#FENETRE))
          TextGadget(#TitCpMP3, 16, 20, 68, 20, "Fichier MP3")
          StringGadget(#CpMP3, 96, 20, 300, 20, ArgNomFichier, #PB_String_ReadOnly)
          TextGadget(#TitDescription, 16, 52, 64, 20, "Description")
          StringGadget(#CpDescription, 96, 52, 300, 20, TagDescAPIC, #PB_String_ReadOnly)
          TextGadget(#TitType, 16, 84, 64, 20, "Type")
          StringGadget(#CpType, 96, 84, 300, 20, TagDescImage, #PB_String_ReadOnly)
          TailleImageX=ImageWidth(NoImage)
          TailleImageY=ImageHeight(NoImage)
          If TailleImageX>300 Or TailleImageY>300
            Ratio=Fc_MinF(300/TailleImageX,300/TailleImageY)
            TailleImageX=TailleImageX*Ratio:TailleImageY=TailleImageY*Ratio
            ResizeImage(NoImage,TailleImageX,TailleImageY)
          EndIf
          ImageGadget(#ImgAPIC, 56, 132, 300,300,ImageID(#Image1),#PB_Image_Border)
          Repeat
          Until WaitWindowEvent()=#PB_Event_CloseWindow
        EndIf
      EndIf
    EndIf
  EndIf
Fc_LireFrameAPIC_Fin:
  FreeMemory(*Tampon)
  ProcedureReturn Resultat
EndProcedure

Fc_LireFrameAPIC(NoFichier,"Ici : Nom du fichier déjà ouvert et fileseek() sur le début du Tag APIC !!!!")
Tu devrais tenir le bon bout maintenant :D

EDIT 04/07/10 : Correction du type retourné par la procédure Fc_LireFrameAPIC

Re: tags des fichiers audio

Publié : ven. 02/juil./2010 9:45
par Parole De JOJO
merci beaucoup
c'est excellent

Re: tags des fichiers audio

Publié : ven. 02/juil./2010 15:17
par boddhi
You're welcome !!! :D

Re: tags des fichiers audio

Publié : sam. 31/juil./2010 13:07
par Ar-S
Voilà un topic qui avance bien !

Ou en es tu Parole De JOJO ?