Autore Topic: [risolto] estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )  (Letto 1485 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
In primis scusate la lunga assenza, ma sono stato (e ancora siamo piu' o meno nella stessa situazione) incasinatissimo ......
In secundis, Ciao :D

ora tornando in tema, cercando un po' in giro nel forum stavo provando ad individuare se qualche utente si fosse mai imbattuto nell'esigenza di estrarre i tag ID3 dai file audio, utilizzando gambas.

Ho trovato questa vecchia discussione: http://www.gambas-it.org/smf/index.php?topic=866.0 ed anche un modulo per Gambas2 postata dal buon Giulio .......
ed anche fsurfing aveva fatto qualcosa nel suo Gplay.

Pero' di primo acchitto il modulo da una serie di errori e per ora l'ho accantonato e Gplay non l'ho ancora chiesto a fsurfing ;-)

Qualche suggerimento?

Forse anche Gstreamer ha la possibilita' di estrarre le informazioni sui metadati, ma sono pigro e non ho voglia di mettere su tutto l'ambaradan di gstreamer, filtri, alberi etc :D

un saluto

Federico

« Ultima modifica: 18 Febbraio 2014, 18:00:15 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
« Risposta #1 il: 13 Febbraio 2014, 18:30:35 »
Oltre alla risorsa del componente gb.media che gestisce le risorse di GStreamer:
https://www.gambas-it.org/wiki/index.php/La_gestione_dell%27audio_e_dei_file_audio_mediante_il_componente_gb.media#Estrarre_i_Tag_da_un_file_audio

altre informazioni su alcuni tipi di file audio possono essere ricavate con le risorse del API di Sox:
http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_generali_da_un_file_audio_con_le_funzioni_esterne_del_API_di_Sox

Poi c'è il codice fsurfinghiano per gli mp3:
http://www.gambas-it.org/smf/index.php?topic=2450.msg26533#msg26533


....per tutto il resto c'è da studiare la struttura dei vari formati di file audio e le altre eventuali librerie !  :violent:
« Ultima modifica: 26 Ottobre 2022, 12:36:27 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
« Risposta #2 il: 14 Febbraio 2014, 16:23:05 »
...puoi utilizzare per gli MP3 anche le risorse della libreria libid3tag.
Ne ho fatto un riassunto/esempio nella nostra WIKI:
http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_da_un_file_MP3_con_le_funzioni_esterne_del_API_di_Id3tag
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
« Risposta #3 il: 18 Febbraio 2014, 13:12:23 »
...oppure usando le sole funzioni di Gambas anche in quest'altro modo (oltre quello di fsurfing):  :-X
Codice: gambas [Seleziona]

Public Sub Main()

  Dim percorsoFile, s, tag As String
  Dim ordo As New Integer[]
  Dim j, rm, k As Integer


   percorsoFile = "/percorso/del/file.mp3"
  
   s = File.Load(percorsoFile)
    
   Print "File audio mp3: '"; File.Name(percorsoFile); "'"
   Print "\nDimensione: "; Len(s); " byte"
  
   ordo.add(InStr(s, "TALB"))
    ordo.add(InStr(s, "TCOM"))
    ordo.add(InStr(s, "TCOP"))
    ordo.add(InStr(s, "TDAT"))
    ordo.add(InStr(s, "TDEN"))
    ordo.add(InStr(s, "TDLY"))
    ordo.add(InStr(s, "TDRC"))
    ordo.add(InStr(s, "TENC"))
    ordo.add(InStr(s, "TFLP"))
    ordo.add(InStr(s, "TIT1"))
    ordo.add(InStr(s, "TIT2"))
    ordo.add(InStr(s, "TIT3"))
    ordo.add(InStr(s, "TKEY"))
    ordo.add(InStr(s, "TLAN"))
    ordo.add(InStr(s, "TLEN"))
    ordo.add(InStr(s, "TMCL"))
    ordo.add(InStr(s, "TMED"))
    ordo.add(InStr(s, "TOAL"))
    ordo.add(InStr(s, "TOFN"))
    ordo.add(InStr(s, "TOLY"))
    ordo.add(InStr(s, "TOPE"))
    ordo.add(InStr(s, "TORY"))
    ordo.add(InStr(s, "TOWN"))
    ordo.add(InStr(s, "TPE1"))
    ordo.add(InStr(s, "TPE2"))
    ordo.add(InStr(s, "TPE3"))
    ordo.add(InStr(s, "TPE4"))
    ordo.add(InStr(s, "TPUB"))
    ordo.add(InStr(s, "TCON"))
    ordo.add(InStr(s, "TDRC"))
    ordo.add(InStr(s, "TRCK"))
    ordo.add(InStr(s, "TRDA"))
    ordo.add(InStr(s, "TRSN"))
    ordo.add(InStr(s, "TRSO"))
    ordo.add(InStr(s, "TSRC"))
    ordo.add(InStr(s, "TSSE"))
    ordo.add(InStr(s, "TYER"))
    ordo.add(InStr(s, "TXXX"))
    ordo.add(RInStr(s, "TXXX"))
    ordo.add(InStr(s, "COMM"))
    ordo.add(InStr(s, "PRIV"))
    ordo.add(RInStr(s, "PRIV"))
    ordo.add(RInStr(s, "WXXX"))
  

   While j < ordo.Count
     If ordo[j] = 0 Then
       ordo.Remove(j)
       Inc rm
       Dec j
     Endif
     Inc j
   Wend

   ordo.Sort()

   Print "\n  == T A G =="
    
   If ordo.Count > 0 Then    ' Se è presente almeno un TAG

     For j = 0 To ordo.Max

       k = ordo[j]

       While k < ordo[ordo.max] + 24
        
         If j < ordo.Max Then
' Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:
           If (k < ordo[j + 1]) And ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then
             tag &= Mid(s, k, 1)
           Else
             tag &= " "
           Endif
         Else
' Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:
           If ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then
             tag &= Mid(s, k, 1)
           Else
             tag &= " "
           Endif

         Endif
        
         Inc k
       Wend
      
       If (Left(tag, 4) <> "PRIV") And (InStr(tag, "PRIV") > 0) Then tag = Left(tag, InStr(tag, "PRIV") - 1)

       Print tag
       tag = Null
      
    Next
    
    Else
      Print "Assenti !"
    Endif

End
« Ultima modifica: 19 Febbraio 2014, 01:52:08 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
« Risposta #4 il: 18 Febbraio 2014, 14:31:05 »
Interessante ....
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
« Risposta #5 il: 18 Febbraio 2014, 16:16:22 »
...ma, in fondo, i TAG nel file sono per lo più dati stringa, e quindi come tali vanno trattati.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
« Risposta #6 il: 18 Febbraio 2014, 17:59:35 »
Ho implementato il metodo usato in gplay e va abbastanza bene.
Ora provo a studiare se per gli ogg è lo stesso ...

http://www.xiph.org/vorbis/doc/v-comment.html
« Ultima modifica: 18 Febbraio 2014, 18:35:33 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
« Risposta #7 il: 18 Febbraio 2014, 18:04:47 »
Ora provo a studiare se per gli ogg è lo stesso ...

Il codice che ho inserito prima non va bene per i file formato .ogg, poiché le intestazioni (header) dei Tag, pur essendo ugulmente dati di tipo stringa, hanno un'identificazione testuale comunque diversa.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
« Risposta #8 il: 18 Febbraio 2014, 18:36:14 »
Ora provo a studiare se per gli ogg è lo stesso ...

Il codice che ho inserito prima non va bene per i file formato .ogg, poiché le intestazioni (header) dei Tag, pur essendo ugulmente dati di tipo stringa, hanno un'identificazione testuale comunque diversa.

negli ogg c'e' un "vettore di commenti" .... domani gli do' un occhio
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
« Risposta #9 il: 18 Febbraio 2014, 23:28:51 »
Interessante ....

Se poi, sempre con le sole funzioni di Gambas, vuoi conoscere TAG ed informazioni generali sul file .mp3, potresti anche provare un semplice codice come quello che ho riportato come breve esempio nella WIKI:  :-\

http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_e_TAG_da_un_file_MP3_con_le_sole_funzioni_di_Gambas
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
« Risposta #10 il: 19 Febbraio 2014, 01:47:56 »
http://www.xiph.org/vorbis/doc/v-comment.html
negli ogg c'e' un "vettore di commenti"

Sì.... ma la pappa è sempre quella: dati stringa raggruppati... e quindi io opererei in modo analogo al formato mp3:  :-X
Codice: gambas [Seleziona]

Public Sub Main()

  Dim percorsoFile, s, tag As String
  Dim ordo As New Integer[]
  Dim j, rm, k As Integer
  Dim agg As Byte = 24



    percorsoFile = "/percorso/del/file.ogg"
  
    s = File.Load(percorsoFile)
    
' Verifica se effettivamente è un file .ogg:
    If Left(s, 4) <> "OggS" Then Error.Raise("Attenzione ! Il file caricato non è un file OGG !")
    
Print "File audio ogg: '"; File.Name(percorsoFile); "'"
Print "\nDimensione: "; Len(s); " byte"
  
    ordo.add(InStr(s, "TITLE="))
    ordo.add(InStr(s, "VERSION="))
    ordo.add(InStr(s, "ALBUM="))
    ordo.add(InStr(s, "TRACKNUMBER="))
    ordo.add(InStr(s, "ARTIST="))
    ordo.add(InStr(s, "PERFORMER="))
    ordo.add(InStr(s, "COPYRIGHT="))
    ordo.add(InStr(s, "LICENSE="))
    ordo.add(InStr(s, "ORGANIZATION="))
    ordo.add(InStr(s, "DESCRIPTION="))
    ordo.add(InStr(s, "GENRE="))
    ordo.add(InStr(s, "DATE="))
    ordo.add(InStr(s, "LOCATION="))
    ordo.add(InStr(s, "CONTACT="))
    ordo.add(InStr(s, "COMMENT="))
    ordo.add(InStr(s, "ISRC="))

    While j < ordo.Count
      If ordo[j] = 0 Then
        ordo.Remove(j)
        Inc rm
        Dec j
      Endif
      Inc j
    Wend

    ordo.Sort()
    
   Print "\n  == T A G =="

    If ordo.Count > 0 Then    ' Se è presente almeno un TAG

    If Mid(s, ordo[ordo.Max], 12) = "TRACKNUMBER=" Then agg = 15
    
    For j = 0 To ordo.Max

      k = ordo[j]

      While k < ordo[ordo.max] + agg
        
        If j < ordo.Max Then
' Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:
          If (k < ordo[j + 1]) And ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then
            tag &= Mid(s, k, 1)
          Else
            tag &= " "
          Endif
        Else
' Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:
          If ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then
            tag &= Mid(s, k, 1)
          Else
            tag &= " "
          Endif

        Endif
        
        Inc k

      Wend

      Print tag
      tag = Null
      
    Next
    
    Else
      Print "Assenti !"
  Endif

End


Se poi ci vuoi aggiungere anche un paio di ulteriori informazioni generali sul file:
http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_e_TAG_da_un_file_OggVorbis_con_le_sole_funzioni_di_Gambas
« Ultima modifica: 19 Febbraio 2014, 12:30:04 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
« Ultima modifica: 12 Marzo 2014, 12:59:12 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
vuott guarda che di librerie ce ne sono a tonnellate! che le vuoi listare tutte?   :P
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
...di librerie ce ne sono a tonnellate!
...infatti, se vuoi ottenere semplicemente i dati generali di un mp3, puoi anche utilizzare le risorse del API di Smpeg:   ;D
http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_da_un_file_MP3_con_le_funzioni_esterne_del_API_di_Smpeg



Più in generale segnalo nuovamente la sezione della nostra Wiki sulla gestione dell'audio in Gambas:

   https://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Gestione_dei_dati_audio_e_dei_file_audio
« Ultima modifica: 20 Agosto 2020, 23:45:17 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »