FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Gestionnaire de Projets Panoramic
par Minibug Aujourd'hui à 2:10

» Mah-Jong européen new-look
par jjn4 Hier à 16:35

» Button_picture
par pascal10000 Hier à 11:41

» Pourquoi le compilateur stagne
par Minibug Hier à 11:09

» 4 (en analyse): SYNEDIT_TARGET_IS_OBJECT devient inactif
par Jack Hier à 10:09

» 3 (en analyse): Mauvaise interprétation du string "THEN"
par Jack Hier à 10:03

» KGF.dll - demandes ou suggestions de modifications ou ajouts
par Marc Hier à 10:00

» KGF_dll - nouvelles versions
par pascal10000 Mer 13 Déc 2017 - 17:27

» track_bar circulaire
par Klaus Mar 12 Déc 2017 - 13:54

» API Windows
par Klaus Mar 12 Déc 2017 - 3:21

» Cartes de voeux, menus, etc.
par JL35 Lun 11 Déc 2017 - 17:48

» a l'aide klaus
par Minibug Lun 11 Déc 2017 - 11:42

» bug SYNEDIT_TARGET_IS_OBJECT
par Jack Lun 11 Déc 2017 - 0:16

» Jukebox : Serge Reggiani
par papydall Sam 9 Déc 2017 - 5:58

» Ecouter la radio fm sur votre pc
par pascal10000 Sam 9 Déc 2017 - 3:42

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Décembre 2017
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
25262728293031
CalendrierCalendrier

Partagez | 
 

 tag mp3

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : Précédent  1, 2, 3, 4, 5  Suivant
AuteurMessage
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Mer 1 Oct 2014 - 19:09

Eh ben... t'es pas sorti de l'auberge !
J'ai tenté d'extraire l'image d'un mp3, mais je ne trouve pas la logique des délimiteurs... en attendant j'ai trouvé comment faire pour extraire les dimensions d'un jpg, c'est déjà ça.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mer 1 Oct 2014 - 20:35

Je sens que je vais mettre la dll de klaus à contribution... Laughing
Elle a des fonctions sympa pour faire de la recherche.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Jeu 2 Oct 2014 - 1:04

@ JL35,

Je te remercie ici pour ta réponse au sujet de la fonction de la dll.
Klaus est déjà à la version suivante et cela aurait embrouillé son sujet.

J' ai mieux ( toujours dans les fonctions de kgf ) pour retrouver rapidement
les marqueurs dans un fichier [ res% = dll_call3("SearchPatternInBinaryFile",adr(nom$),adr(pattern$),p%) ]
renvoie le premier octet du marqueur.

Autre chose, on n' est pas obligé de récupérer tout les tags et certains sont limité si j' ai bien lu.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Jeu 2 Oct 2014 - 15:11

Il me semble bien (mais c'est toi qui vois en fonction de ton projet) qu'il y a une grande majorité de tags dont on n'a rien à faire !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Jeu 2 Oct 2014 - 19:26

Je pense que les tags en id3v1 sont suffisants :

Titre
Interprète
Album
Commentaire  (  scratch )
Année ( scratch cela peut faire mal à son égo çà !... Laughing )
Piste
Genre

mais parfois ils sont enregistrés en id3v2.3 et pas dispo dans les id3v1
d' où l' intérêt de les récupérer dans cette norme.

La jaquette affraid , c' est une autre paire de manches.
Si tout les marqueurs étaient présents, et dans un ordre défini, même vide, sur tous les fichiers...
...Même avec des tailles variables, cela pourrait se faire plus facilement mais malheureusement
ce n' est pas le cas. 
Encore faut il savoir reconstruire l' image dans un picture à partir des données récupérées et
ce n' est pas mon cas à ce jours Embarassed .
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Jeu 2 Oct 2014 - 20:58

Pour l'image (les images ? recto et verso de la pochette par exemple ?) il me semble, mais ce n'est qu'un avis a priori, qu'il suffit de l'extraire telle quelle dans un fichier, le tout étant de savoir où elle commence et sa taille, ou sa fin, et son type (jpg, png..), mais sinon je ne crois pas qu'elle soit recodée ou compressée ou autre.
Je la vois bien en binaire dans mes fichiers exemple, complète, mais je ne vois pas quels sont les délimiteurs.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Jeu 2 Oct 2014 - 23:30

Je crois que ce projet va rejoindre ses copains dans la rubrique " En cours..." Laughing
Je vois comment faire pour récupérer les données mais je n' arrive pas à le mettre
en pratique... Crying or Very sad

J' arrive à :

Récupérer les marqueurs présents
Récupérer l' ordre des marqueurs (pour savoir qui est présent ou pas et suit qui et donc qui est la fin de l' autre... drunken rendeer santa geek jocolor  Suspect )
Récupérer l' octet de début du tag 
mais je bug pour récupérer les données entre deux tag... Embarassed ( sachant que n' importe lequel peut suivre n' importe qui ou presque  Suspect Suspect Suspect)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Jeu 2 Oct 2014 - 23:36

si tu as les pointeurs de début et de fin du tag (ou début du tag suivant), c'est facile de récupérer la zone entre les deux, avec un FileBin_Block_Read par exemple, dans un tableau ? après il n'y a plus qu'à analyser le contenu.
Positionnement sur le début: Filebin_Position, lecture des n octets: Filebin_Block_Read.

Mais je reconnais volontiers que tu t'est lancé dans une drôle d'aventure.
Pour moi je me serais contenté des ID3v1, avec leurs tags bien carrés, bien définis.
Et si le fichier n'a pas de tags ID3v1 tu peux facilement les ajouter (128 octets).
Après il faut les remplir, mais c'est une autre histoire.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Jeu 2 Oct 2014 - 23:48

Je me sers d' une fonction de la dll de Klaus pour savoir lesquels des 74 marqueurs existants et placés dans une liste
sont présents
que je place dans un tableau jusque ou le num corespond à l' octet de depart pour les remettre dans l' ordre

Puis, pour raccourcir le traitement, je prends les 3000 premiers octets que je place dans un tableau de %
par filebin_block_read.

puis je lis mon tableau de la position de départ du tag juqu' à ce que les 4 octets en partant de x% correspondent à un autre marqueur
en verifiant tout les marqueurs de la liste. mais en retour , rien... scratch

Poutant a$=chr$(id3v2%(x%)) devrait me renvoyer le caractère de l' octet placé dans le tableau...


Je crois que le binaire est entrain de me rendre barjot.... Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Ven 3 Oct 2014 - 0:03

Je regarde, un peu, de mon côté...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Ven 3 Oct 2014 - 1:47

J' ai fait cela et cela à l' air de fonctionner :
( pour l' instant, seul le marqueur TALB est extrait ):
Code:
' fichier  test
dim f$
f$="C:\PROGRA~2\PANORA~1\MES_PR~1\Musique\MP3TAG~1\sources\MP3TAG~1\ROMANE~1.MP3"
' kgf.dll
dim kgf$
kgf$="C:\PROGRA~2\PANORA~1\Mes_Dlls\KGF\KGF.dll"
dll_on kgf$
' liste des marqueurs
dim Marq$
Marq$="C:\PROGRA~2\PANORA~1\MES_PR~1\Musique\MP3TAG~1\sources\MP3TAG~1\MARQUE~1.TXT"
' objets
dim no%,mem%,list%
' Tableau des 3000 premiers octets
dim id3v2%(3000)
' Tableau des marqueurs avec position
dim M$(3000),M2$(74,2)
' memo de visualisation
no%=no%+1 : mem%=no%
memo no%
full_space no%
bar_both no%
font_name no%,"Courier"
' dlist des marqueurs
no%=no%+1 : list%=no%
dlist no%
file_load no%,Marq$

Extract_Id3v2()
End

Sub Extract_Id3v2()
  dim_local tf%,res%,pattern$,x%,talb_d%,tit2_d%,tpe2_d%,tcon_d%,trck_d%,tyer_d%,v%,a$,b$,y%,fin%,mf$
  no%=no%+1
'  ouverture du fichier en mode binaire
  filebin_open_read no%,f$
'  recup de la taille du fichier
  tf%=filebin_size(no%)
'  fermeture du fichier en mode binaire
  filebin_close no%
  no%=no%-1
'  recup des marqueurs et de leurs positions
  for x%=1 to count(list%)
      pattern$=item_read$(list%,x%)
      res% = dll_call3("SearchPatternInBinaryFile",adr(f$),adr(pattern$),0)
      M2$(x%,1)=Pattern$
      M2$(x%,2)=str$(res%)
'    affichage
      item_add mem%,M2$(x%,1)+" | "+M2$(x%,2)
  next x%
'  seul m' interesse les marqueurs
'  TALB => Album
'  TPE2 => Interprète
'  TIT2 => Titre
'  TCON => Genre
'  TRCK => Piste
'  TYER => Année
'  affectation des points de départ
  for x%=1 to 74
      if M2$(x%,1)<>""
        if M2$(x%,1)="TALB" :talb_d% =val(M2$(x%,2))-1 :end_if
        if M2$(x%,1)="TPE2" :tit2_d% =val(M2$(x%,2))-1 :end_if
        if M2$(x%,1)="TIT2" :tpe2_d% =val(M2$(x%,2))-1 :end_if
        if M2$(x%,1)="TCON" :tcon_d% =val(M2$(x%,2))-1 :end_if
        if M2$(x%,1)="TRCK" :trck_d% =val(M2$(x%,2))-1 :end_if
        if M2$(x%,1)="TYER" :tyer_d% =val(M2$(x%,2))-1 :end_if
      end_if
  next x%

  no%=no%+1
  filebin_open_read no%,f$
  filebin_position no%,talb_d%+4

  for x%=1 to tf%
      filebin_read no%,v%
      a$=chr$(v%)
      if v%<>0 and v%<253 :b$=b$+a$ : end_if
      for y%=1 to count(list%)
        if right$(b$,4)=item_read$(list%,y%)
            mf$=right$(b$,4)
            b$=left$(b$,len(b$)-4)
            fin%=1
        end_if
      next y%
      if fin%=1
        exit_for
      end_if
  next x%
  fin%=0
  b$=trim$(b$)
  message b$+chr$(13)+mf$
  filebin_close no%
  no%=no%-1
End_sub
normalement, on devrait pouvoir tout récupérer comme cela à une condition, connaitre le marqueur de fin des tags et la fin de APIC.


Dernière édition par ygeronimi le Ven 3 Oct 2014 - 2:17, édité 1 fois (Raison : modif pour prendre APIC et autres)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Ven 3 Oct 2014 - 2:34

Je m' aperçois d' une chose :

Un tag a un point de départ a% et de fin b% avec un longueur
définie dans le fichier d' origine de x octets. 
Ce bloc de x octets peut être placé au milieu du fichier ( exemple ).
On peut lire ce bloc, remplacer la valeur des octets puis le remettre
à sa place. 

Jusque là, tout va bien... Laughing

Mais, imaginons que le tag que l' on veut soit plus long en octet
que le tag d' origine... en le replacant, on changera les octets
d' origine + les octets suivants ( qui n' ont rien à voir avec le tag )
qui appartiennent à un autre bloc... affraid.
Il faudra donc, stocker les octets précédent ainsi que les suivants dans deux variables pour ensuite reconstituer le fichier.... pale


Une commande filebin_block_insert qui décale les octets suivant serait la bien venue, non ?  à moins que ce soit techniquement impossible.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Ven 3 Oct 2014 - 16:09

Là tu as raison, si la longueur du bloc à écrire est différente du bloc d'origine tu détruis tout.
Il faut reconstituer un nouveau fichier avec ce qu'il y a avant, ton nouveau bloc, et ce qu'il y a après... Rolling Eyes
D'ailleurs c'est probablement ce qu'il faut faire dans tous les cas, à tout hasard.

C'est là que la dll de Klaus (File to String) est bien pratique, tu fais tout sous forme de chaîne de caractères, insertions, etc, et puis tu réécris la chaîne (String to File), et le tour est joué.

Pour ma part je m'étais lancé dans l'extraction d'image, mais après avoir bien galéré j'y renonce, trop de paramètres variables.
Si par hasard j'en ai besoin je ferai appel à un logiciel externe, il n'en manque pas (par exemple tag.txt).
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Ven 3 Oct 2014 - 23:16

Finalement, pour m'y retrouver, j'ai fait une petite sub qui liste les tags du mp3:
- pour les tags ID3v1: liste des tags avec leur contenu
- pour les tags ID3v2: liste des tags avec leur nom, leur emplacement binaire dans le fichier, et leur taille totale (nom du tag compris)
(et j'ai bien été obligé d'utiliser la dll de l'ami Klaus: File to String, les solutions purement panoramic sont bien trop longues à l'exécution).
J'ai essayé avec plusieurs types de fichiers mp3, ça a marché pour tous (les miens...).
NB La liste des tags ID3v2, sous forme de DATA, sera sans doute à mettre à jour (il y a eu des extensions), c'est facile, il suffit de rajouter les datas dans la liste (avant le "F" de fin) -> c'est fait pour la v2.4.
Et pour la signification des tags, il faut aller voir là: http://en.wikipedia.org/wiki/ID3
Code:
DIM f$, kgf$
f$ = "C:\MP3TEST\APIC_v2.3_ASCII.mp3": ' <<<<<<<<<<<<<<<<<<<<<<< FICHIER MP3
kgf$ = "C:\PANORAMIC\KLAUS\DLLs\KGF.dll": ' <<<<<<<<<<<<<<<<<<<< PATH DE KGF.DLL
WIDTH 0,400
MEMO 1: WIDTH 1,380: HEIGHT 1,400: FONT_NAME 1,"Lucida Console": FONT_SIZE 1,10
Listag(f$)
CLIPBOARD_PASTE 1
END
' ==============================================================================
SUB Listag(f$)
' Liste des tags ID3 d'un fichier mp3 -> clipboard
' ID3v1: Nom du tag + contenu
' ID3v2: Nom du tag, Position, Longueur
' Tags ID3v2:
DATA "Tags:"
DATA "AENC","APIC","COMM","COMR","ENCR","EQUA","ETCO","GEOB","GRID","IPLS","LINK"
DATA "MCDI","MLLT","OWNE","PRIV","PCNT","POPM","POSS","RBUF","RVAD","RVRB","SYLT"
DATA "SYTC","TALB","TBPM","TCOM","TCON","TCOP","TDAT","TDLY","TENC","TEXT","TFLT"
DATA "TIME","TIT1","TIT2","TIT3","TKEY","TLAN","TLEN","TMED","TOAL","TOFN","TOLY"
DATA "TOPE","TORY","TOWN","TPE1","TPE2","TPE3","TPE4","TPOS","TPUB","TRCK","TRDA"
DATA "TRSN","TRSO","TSIZ","TSRC","TSSE","TYER","TXXX","UFID","USER","USLT","WCOM"
DATA "WCOP","WOAF","WOAR","WOAS","WORS","WPAY","WPUB","WXXX"
' nouveaux tags (v2.4):
DATA "ASPI","EQU2","TMCL","TIPL","RVA2","TDRC","TDOR","SEEK","SIGN","TDEN","TDRL"
DATA "TDTG","TMCL","TMOO","TPRO","TSOA","TSOP","TSOT","TSST"
DATA "F"
DIM_LOCAL a$,buf$,sz%,rs%,tab$(100),v%(300),nt,i%,k%,sk%,v1$,id3v1$,v2$,id3v2$,rc$
DIM_LOCAL lg%,ff%
rc$ = CHR$(13)+CHR$(10)
READ a$: WHILE a$<>"Tags:": READ a$: END_WHILE
READ a$: nt=0
WHILE a$<>"F": nt=nt+1: tab$(nt) = a$: READ a$: END_WHILE: ' Table des tags ID3v2
' 1) lecture du fichier dans une chaîne ascii
FILEBIN_OPEN_READ 9, f$: sz% = FILEBIN_SIZE(9)
FILEBIN_POSITION 9,sz%-128: FILEBIN_BLOCK_READ 9,128,v%(0): id3v1$ = ""
IF v%(0)=84 AND v%(1)=65 AND v%(2)=71: ' 'TAG'
    FOR i%=0 TO 127: id3v1$=id3v1$+CHR$(v%(i%)): NEXT i%: ' Tags ID3v1 présents
END_IF
FILEBIN_POSITION 9,0: FILEBIN_BLOCK_READ 9,3,v%(0): FILEBIN_CLOSE 9: buf$=""
IF v%(0)=73 AND v%(1)=68 AND v%(2)=51: ' 'ID3'
    buf$ = STRING$(sz%," ")
    DLL_ON kgf$
        rs% = DLL_CALL2("ReadBinaryFileToString",ADR(f$),ADR(buf$))
    DLL_OFF
END_IF
v1$ = "--- Tags ID3v1: ---"+rc$
' 1) Tags ID3v1
IF id3v1$ <> ""
    a$ = MID$(id3v1$,4,30)
    IF INSTR(a$,CHR$(0))>0 THEN a$ = LEFT$(a$,INSTR(a$,CHR$(0))-1)
    v1$ = v1$ + "Titre : "+a$+rc$
    a$ = MID$(id3v1$,34,30)
    IF INSTR(a$,CHR$(0))>0 THEN a$ = LEFT$(a$,INSTR(a$,CHR$(0))-1)
    v1$ = v1$ + "Auteur: "+a$+rc$
    a$ = MID$(id3v1$,64,30)
    IF INSTR(a$,CHR$(0))>0 THEN a$ = LEFT$(a$,INSTR(a$,CHR$(0))-1)
    v1$ = v1$ + "Album : "+a$+rc$
    a$ = MID$(id3v1$,94,4)
    IF INSTR(a$,CHR$(0))>0 THEN a$ = LEFT$(a$,INSTR(a$,CHR$(0))-1)
    v1$ = v1$ + "Année : "+a$+rc$
    a$ = MID$(id3v1$,98,28)
    IF INSTR(a$,CHR$(0))>0 THEN a$ = LEFT$(a$,INSTR(a$,CHR$(0))-1)
    v1$ = v1$ + "Comnt : "+a$+rc$
    a$ = STR$(ASC(MID$(id3v1$,127,1)))
    v1$ = v1$ + "Piste : "+a$+rc$
    a$ = STR$(ASC(RIGHT$(id3v1$,1)))
    v1$ = v1$ + "Genre : "+a$+rc$
END_IF
' 2) Tags ID3v2
v2$ = "--- Tags ID3v2: ---"+rc$
IF buf$ <> ""
    ' recherche du 1er tag
    sk%=sz%: ff% = 0
    FOR i% = 1 TO nt
        a$ = tab$(i%): k% = INSTR(buf$,a$)
        IF k% > 0 AND k%<sk% THEN sk%=k%
    NEXT i%
    WHILE ff% = 0
        lg% = ASC(MID$(buf$,sk%+7,1))+256*ASC(MID$(buf$,sk%+6,1))+10
        v2$ = v2$ + MID$(buf$,sk%,4)+": " + STR$(sk%-1)+", "+STR$(lg%)+rc$: ' tag + posit+longueur
        sk%=sk%+lg%
        a$ = MID$(buf$,sk%,4)
        FOR i% = 1 to nt
            IF a$ = tab$(i%) THEN EXIT_FOR
        NEXT i%
    IF i% > nt THEN ff% = 1
    END_WHILE
END_IF
CLIPBOARD_STRING_COPY v1$+rc$+v2$
END_SUB
' ==============================================================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Sam 4 Oct 2014 - 2:54

Une chose au sujet des id3v2.

dans le traitement du tage en lecture, il faut penser à éliminer les caractères "nul" ou "0" et autres bizarreries 
avant de les afficher.... Twisted Evil

Autre chose, tu affiches l' octet de départ et de fin d' un tag mais il ne faut pas oublié que ce bloc contiendra le marqueur
pour que le bloc ne contienne que le tag lui même, l' octet de départ est o+4... Wink

Ceci dit, tes subs sont très rapides et font ce que je fais en moins de ligne .
Je suis jaloux de ta faculté à manier "while...end_while"   Laughing .

Si tu peux un peu plus détailler les commentaires, je me ferai un plaisir de mettre ces Sub sur le site.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Sam 4 Oct 2014 - 10:41

Objection, votre Honneur !

1) Tags en lecture: j'élimine bien les zéros de fin du contenu avant affichage:
Code:
IF INSTR(a$,CHR$(0))>0 THEN a$ = LEFT$(a$,INSTR(a$,CHR$(0))-1)

2) C'est volontairement que je récupère intégralement le tag, sans analyse, pour que l'utilisateur puisse l'analyser lui-même
(chaque tag est un cas particulier, mais la structure générale est par exemple (tag image, en hexa):
Code:
65 80 73 67   00   00 1D 61   00   00 00   XX ........ XX   00   03   XX ..... XX   00   FF D8 FF ......
 A  P  I  C        **taille        * ? *   ** Mime type *       typ   *nom image*        * début image (jpg)
                  totale -10                 (type image)  
- la taille totale indiquée est la taille totale du tag, tout compris, -10 octets.
- l'octet à 03 avant le nom image est le picture type: image recto, ou image verso ou ..., ici image recto: cover front.

C'est pas fini, je vais essayer de faire quelques subs pour simplifier l'utilisation de tout ça.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Sam 4 Oct 2014 - 13:45

Ce qui serait intéressant de savoir, au niveau du tag APIC, 
ce sont les dimensions LxH et le premier et dernier octet  couleur de l' image.
Cela permettrait de reconstituer l' image et de visualiser cette image dans un picture, 
après tout est possible ou presque... Laughing

Je vais regarder toute ces données de près... study
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Sam 4 Oct 2014 - 14:37

Pour avoir les dimensions de l'image (LxH pixels) il faut d'abord la reconstituer, dans un fichier (je ne vois pas ce que tu appelles le premier et dernier octet 'couleur', je dirais le 1er et dernier octet de toute l'image elle-même), et ensuite appliquer une sub qui donne les dimensions.

Je n'ai dans mes exemples que des images jpg incluses, et là c'est facile, ça commence par FF D8, et là je fais l'extraction sans problème, et ensuite la visualisation est facile.
Mais je ne sais pas s'il y a d'autres formats (sans doute au moins png), et là je ne sais pas comment ça se présente.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Dim 5 Oct 2014 - 0:45

Je suis bien arrivé à retrouver les deux octets de départ du fichier "FF D8" mais pas les deux octets de fin "FF D9".

J' ai la pochette au format *.jpg d' un album (1441x1454 - 439ko)
J' ai la chanson en *.mp3 sans la pochette en APIC (3.5 mo)
j' ai la chanson en *.mp3 avec la pochette en APIC (4031 ko)

Bref, il semblerait que l' image de la pochette ne soit pas codée 
mais où est donc passé "FF D9" ?... scratch


Edit : Il doit y avoir un truc mais quoi... scratch...je n' arrive pas à recontituer l' image en son entier.
j' ai la bonne taille, les infos du fichiers passent pour du jpg mais l' image est tronquée.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Dim 5 Oct 2014 - 15:06

Regarde dans le dump du fichier mp3, en notant l'emplacement de la balise APIC contenant l'image, tu ajoutes la taille+10, et dans le dump tu dois tomber sur le ff d9... évidemment ce sont de petits calculs à faire en arithmétique hexa...
et si tu n'as pas ce ffd9 dans ton fichier jpg extrait c'est qu'il y a une erreur dans l'extraction...

Exemple, dans le dump d'un de mes mp3:
Code:
0040: ....... 41 50 49 53 00 00 1d 61 00 00 .......... ff d8 ff e0 00 ...........
               A  P  I  C       taille du tag -10
le 'APIC' est dans le dump à l'adresse 004c
Je fais (10 = a en hexa):
    4c + 1d61 + a = 1db7 qui est l'adresse du bloc suivant.
Je descends le dump jusqu'à la ligne contenant l'adresse 1db7:
Code:
1db0 : 00 00 00 00 3f ff d9 00 00 00 .........

c'est plus facile à faire qu'à dire, mais il faut penser en hexa.
(j'ai gardé d'autrefois une calculette en hexa, c'est bien pratique, mais je peux encore le faire à la main, j'ai encore en tête les tables d'addition et de multiplication en hexa, du temps où je pratiquais le langage assembleur...  Very Happy c'est loin tout ça)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Dim 5 Oct 2014 - 17:12

Ce que je fais :

Une fois le marqueur APIC trouver et ses octets de début et de fin identifiés,
Je reprends dans une boucle la lecture des octets 1 par 1 dont je convertis la valeur en hexa par hex$(v%)
et je recherche l' octet de départ et celui de fin en comparant la suite de octet$ à "FF D8" pour le début
et "FF D9" pour la fin.
Je retrouve bien la suite FF D8 mais pas FF D9 pourtant présent dans le fichier jpg d' origine de la pochette.
Pochette que j' ai incluse en APIC avec MP3 Tagger. et qui apparait en lieu et place de l' icone classique des fichiers
sons sur le fichier mp3.

Je vais faire des captures...
Code:
dim f$
f$="C:\PROGRA~2\PANORA~1\MES_PR~1\Musique\MP3TAG~1\sources\MP3TAG~1\ROMANE~1.MP3"


memo 1
full_space 1
bar_both 1
font_name 1,"Courier"

Extract_APIC(322,56594)
end

Sub Extract_APIC(d%,f%)
   dim_local dep%,fin%,c%,h$,v%,x%,bloc$,lfin$,tf% ,h1$
   dep%=d%+4
   fin%=f%

   filebin_open_read 2,f$
   filebin_position 2,dep%
  
   tf%=filebin_size(2)

   for x%=dep% to fin%
      caption 0,str$(x%)+" "+lfin$
      filebin_read 2,v%
      h$=hex$(v%)
     item_add 1,h$
   next x%
   filebin_close 2
  
  
   filebin_open_write 2,"C:\Users\Yannick\Desktop\Pochette.jpg"
   filebin_position 2,0
   for x%=1 to count(1)
      if x%>1
         if item_read$(1,x%)="D8" and item_read$(1,x%-1)="FF"
            dep%=x%-1
            exit_for
         end_if
      end_if
   next x%
  
   for x%=dep% to count(1)
      filebin_write 2,hex(item_read$(1,x%))
   next x%

   filebin_close 2
   caption 0,"Fin"
End_sub
fichier *.jpg d' origine :fichier *.mp3:Fichier *.jpg reconstitué :
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Dim 5 Oct 2014 - 19:33

Je regarderai tout à l'heure, mais déjà je vois que tu devrais faire
h$ = right$("0"+hex$(v%),2)
pour que tous les caractères aient la même longueur, pour les recherches

chez moi, ton sous-programme marche pour mon fichier mp3, j'ai bien l'image générée correctement dans un fichier à part.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Dim 5 Oct 2014 - 20:16

Je vais faire un essai avec un autre fichier...on ne sait jamais...

Edit : je viens de faire l' essai sur un autre fichier mp3 et l' extraction fonctionne.

Mon premier fichier devait être corrompu... Sad
Maintenant, reste à voir si l' insertion fonctionnera aussi bien... Laughing

Par contre, j' ai remarqué que certains fichier mp3 sans marqueur APIC
affichait une image mais là je ne sais pas d' où elle vient celle là.
J' ai remarqué cela pour des fichiers extraits depuis une vidéo.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: tag mp3   Dim 5 Oct 2014 - 22:03

Il y a peut-être un ou d'autres tags qui peuvent contenir des images ? tu as fait la liste des tags de ce fichier ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Dim 5 Oct 2014 - 22:10

@ JL35,

J' ai fait une liste, reste plus qu' à savoir ce qu' il y a dans chaque marqueur... Laughing

J' ai fait un peu de nettoyage dans ma sub :
Code:
dim f$
f$="C:\Users\Yannick\Music\- Grand Corps Malade\J'écris à l'oral.mp3"

width 0,236
height 0,80

Progress_bar 1
top 1,10 : left 1,10 :width 1,200


Extract_APIC(599,36776)
end

Sub Extract_APIC(d%,f%)
  dim_local dep%,fin%,c%,h$,v%,x%,tf% ,h1$,start%
  dep%=d%+4
  fin%=f%
 
  min 1,0 : max 1,(fin%-dep%): position 1,0

  filebin_open_read 2,f$
  filebin_position 2,dep%
  tf%=filebin_size(2)

  filebin_open_write 3,dir_current$+"\Pochette.jpg"
  filebin_position 3,0
 
  for x%=dep% to fin%
 
      filebin_read 2,v%
      c%=c%+1
     
      position 1,c%
      display

      if c%>1
        if start%=0
            h1$=h$
            h$ = right$("0"+hex$(v%),2)
            if h1$+h$="FFD8"
              start%=1
              filebin_write 3,hex(h1$)
              filebin_write 3,v%
            else
              if h1$+h$="FFD9"
                  filebin_write 3,v%
                  exit_for
              end_if
            end_if
        else
            h$ = right$("0"+hex$(v%),2)
            filebin_write 3,v%
        end_if
      else
        h$ = right$("0"+hex$(v%),2)
      end_if
  next x%

  filebin_close 2
  filebin_close 3
  Terminate
End_sub
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: tag mp3   

Revenir en haut Aller en bas
 
tag mp3
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 3 sur 5Aller à la page : Précédent  1, 2, 3, 4, 5  Suivant

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: