Differenze tra le versioni di "Estrarre informazioni e TAG da un file OggVorbis con le sole funzioni di Gambas"

Da Gambas-it.org - Wikipedia.
Riga 7: Riga 7:
 
   Dim info As String[]   
 
   Dim info As String[]   
 
   Dim ordo As New Integer[]   
 
   Dim ordo As New Integer[]   
   Dim j, rm, k As Integer
+
   Dim i, j, n, rm, k As Integer
  Dim n As Byte
 
 
    
 
    
 +
  percorsoFile = "<FONT color=gray>''/percorso/del/file.ogg''</font>" 
 
    
 
    
  percorsoFile = "''/percorso/del/file.ogg''
+
  s = File.Load(percorsoFile
 
+
   
  s = File.Load(percorsoFile)   
+
<FONT color=gray>' ''Verifica se effettivamente è un file .ogg:''</font>
 +
  If Left(s, 4) <> "OggS" Then Error.Raise("Attenzione ! Il file caricato non è un file OGG !")   
 
      
 
      
  <FONT color=gray>' ''Verifica se effettivamente è un file .ogg:''</font>
+
  Print "File audio ogg:            "; File.Name(percorsoFile)
  If Left(s, 4) <> "OggS" Then Error.Raise("Attenzione ! Il file caricato non è un file OGG !"
+
  Print "\nDimensione:                "; Len(s); " byte"
   
+
  <FONT color=gray>' ''Va a estrarre informazioni generali (frequenza di campionamento e canali) sul file:''</font>
  Print "File audio ogg: '"; File.Name(percorsoFile); "'"
+
  info = EstraeInfo(s)
  Print "\nDimensione: "; Len(s); " byte" 
+
  Print "Frequenza di campionamento: "; info[0]; " hertz"
 +
  Print "Numero canali:              "; info[1]
 +
  Print "Bitrate nominale:           "; info[2]; " kbps"
 +
 
 +
  i = InStr(s, "vorbis", 87)
 +
  n = Asc(s, i + Len("vorbis")) - 10
 +
  Print "Vendor:                     "; Mid(s, i + 10, n)
 +
 
 
   
 
   
<FONT color=gray>' ''Estrae informazioni generali (frequenza di campionamento e canali) sul file:''</font>
+
  ordo.add(InStr(s, "TITLE="))
  info = EstraeInfo(s)
+
  ordo.add(InStr(s, "title="))
  Print "Frequenza di campionamento = hz "; info[0]
+
  ordo.add(InStr(s, "VERSION="))
  Print "Canali = "; info[1]
+
  ordo.add(InStr(s, "version="))
  Print "Bitrate nominale = "; info[2]; " kbps"
+
  ordo.add(InStr(s, "ALBUM="))
 
+
  ordo.add(InStr(s, "VERSION="))
+
  ordo.add(InStr(s, "TRACKNUMBER="))
    ordo.add(InStr(s, "TITLE="))
+
  ordo.add(InStr(s, "tracknumber="))
    ordo.add(InStr(s, "title="))
+
  ordo.add(InStr(s, "ARTIST="))
    ordo.add(InStr(s, "VERSION="))
+
  ordo.add(InStr(s, "artist="))
    ordo.add(InStr(s, "version="))
+
  ordo.add(InStr(s, "PERFORMER="))
    ordo.add(InStr(s, "ALBUM="))
+
  ordo.add(InStr(s, "performer="))
    ordo.add(InStr(s, "VERSION="))
+
  ordo.add(InStr(s, "COPYRIGHT="))
    ordo.add(InStr(s, "TRACKNUMBER="))
+
  ordo.add(InStr(s, "copyright="))
    ordo.add(InStr(s, "tracknumber="))
+
  ordo.add(InStr(s, "LICENSE="))
    ordo.add(InStr(s, "ARTIST="))
+
  ordo.add(InStr(s, "license="))
    ordo.add(InStr(s, "artist="))
+
  ordo.add(InStr(s, "ORGANIZATION="))
    ordo.add(InStr(s, "PERFORMER="))
+
  ordo.add(InStr(s, "organization="))
    ordo.add(InStr(s, "performer="))
+
  ordo.add(InStr(s, "DESCRIPTION="))
    ordo.add(InStr(s, "COPYRIGHT="))
+
  ordo.add(InStr(s, "description="))
    ordo.add(InStr(s, "copyright="))
+
  ordo.add(InStr(s, "GENRE="))
    ordo.add(InStr(s, "LICENSE="))
+
  ordo.add(InStr(s, "genre="))
    ordo.add(InStr(s, "license="))
+
  ordo.add(InStr(s, "DATE="))
    ordo.add(InStr(s, "ORGANIZATION="))
+
  ordo.add(InStr(s, "date="))
    ordo.add(InStr(s, "organization="))
+
  ordo.add(InStr(s, "LOCATION="))
    ordo.add(InStr(s, "DESCRIPTION="))
+
  ordo.add(InStr(s, "location="))
    ordo.add(InStr(s, "description="))
+
  ordo.add(InStr(s, "CONTACT="))
    ordo.add(InStr(s, "GENRE="))
+
  ordo.add(InStr(s, "contact="))
    ordo.add(InStr(s, "genre="))
+
  ordo.add(InStr(s, "COMMENT="))
    ordo.add(InStr(s, "DATE="))
+
  ordo.add(InStr(s, "comment="))
    ordo.add(InStr(s, "date="))
+
  ordo.add(InStr(s, "ISRC="))
    ordo.add(InStr(s, "LOCATION="))
+
  ordo.add(InStr(s, "isrc="))
    ordo.add(InStr(s, "location="))
 
    ordo.add(InStr(s, "CONTACT="))
 
    ordo.add(InStr(s, "contact="))
 
    ordo.add(InStr(s, "COMMENT="))
 
    ordo.add(InStr(s, "comment="))
 
    ordo.add(InStr(s, "ISRC="))
 
    ordo.add(InStr(s, "isrc="))
 
 
    
 
    
  While j < ordo.Count   
+
  While j < ordo.Count   
    If ordo[j] = 0 Then   
+
    If ordo[j] = 0 Then   
 
       ordo.Remove(j)   
 
       ordo.Remove(j)   
 
       Inc rm   
 
       Inc rm   
 
       Dec j   
 
       Dec j   
    Endif   
+
    Endif   
    Inc j   
+
    Inc j   
  Wend   
+
  Wend   
 
    
 
    
  ordo.Sort()
+
  ordo.Sort()
 
   
 
   
  s2 = Mid(s, ordo[ordo.Max], 255)
+
  s2 = Mid(s, ordo[ordo.Max], 255)
  n = InStr(s2, "vorbis") - 1
+
  n = InStr(s2, "vorbis") - 1
 
      
 
      
  Print "\n  == T A G =="   
+
  Print "\n  == T A G =="   
 
    
 
    
  If ordo.Count > 0 Then        <FONT color=gray>' ''Se è presente almeno un TAG''</font>
+
  If ordo.Count > 0 Then        <FONT color=gray>' ''Se è presente almeno un TAG''</font>
   
+
    For j = 0 To ordo.Max   
    For j = 0 To ordo.Max   
+
      k = ordo[j]   
 
+
      While k < ordo[ordo.max] + n
    k = ordo[j]   
+
        If j < ordo.Max Then   
 
 
    While k < ordo[ordo.max] + n
 
       
 
      If j < ordo.Max Then   
 
 
  <FONT color=gray>' ''Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:''</font>
 
  <FONT color=gray>' ''Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:''</font>
        If (k < ordo[j + 1]) And ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then   
+
          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)   
+
            tag &= Mid(s, k, 1)   
        Else   
+
          Else   
          tag &= " "   
+
            tag &= " "   
        Endif   
+
          Endif   
      Else   
+
        Else   
 
  <FONT color=gray>' ''Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:''</font>
 
  <FONT color=gray>' ''Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:''</font>
        If ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then   
+
          If ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then   
          tag &= Mid(s, k, 1)   
+
            tag &= Mid(s, k, 1)   
        Else   
+
          Else   
          tag &= " "   
+
            tag &= " "   
        Endif
+
          Endif
 
+
        Endif
      Endif
+
        Inc k   
       
+
      Wend   
      Inc k   
+
      Print tag   
 
+
      tag = Null  
    Wend   
+
    Next
 
+
  Else   
    Print tag   
+
    Print "Assenti !"   
    tag = Null
+
  Endif   
     
 
  Next
 
   
 
  Else   
 
    Print "Assenti !"   
 
  Endif   
 
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 123: Riga 114:
 
   Dim fr$, br$ As String
 
   Dim fr$, br$ As String
 
   Dim info$ As New String[]
 
   Dim info$ As New String[]
 
 
 
    
 
    
 
  <FONT color=gray>' ''Estrae la frequenza di campionamento:''</font>
 
  <FONT color=gray>' ''Estrae la frequenza di campionamento:''</font>
    For j = 43 To 41 Step -1
+
  For j = 43 To 41 Step -1
      fr$ &= Hex(Asc(Mid(sf, j, 1)), 2)
+
    fr$ &= Hex(Asc(Mid(sf, j, 1)), 2)
    Next
+
  Next
 
    
 
    
    info$.Add(Cstr(Val("&" & fr$)))
+
  info$.Add(Cstr(Val("&" & fr$)))
 
      
 
      
 
  <FONT color=gray>' ''Estrae il numero di canali d'uscita:''</font>
 
  <FONT color=gray>' ''Estrae il numero di canali d'uscita:''</font>
    info$.Add(CStr(Asc(Mid(sf, 40, 1))))
+
  info$.Add(CStr(Asc(Mid(sf, 40, 1))))
+
 
 
  <FONT color=gray>' ''Estrae il bitrate nominale:''</font>
 
  <FONT color=gray>' ''Estrae il bitrate nominale:''</font>
    For j = 51 To 49 Step -1
+
  For j = 51 To 49 Step -1
      br$ &= Hex(Asc(Mid(sf, j, 1)), 2)
+
    br$ &= Hex(Asc(Mid(sf, j, 1)), 2)
    Next
+
  Next
 
      
 
      
    info$.Add(CStr(Val("&" & br$) \ 1000))
+
  info$.Add(CStr(Val("&" & br$) \ 1000))
 
      
 
      
    Return info$
+
  Return info$
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 19:45, 4 ago 2018

E' possibile estrarre informazioni generali e TAG da un file OggVorbis con le sole funzioni di Gambas.

Un possibile codice è il seguente:

Public Sub Main()  
 
 Dim percorsoFile, s, s2, tag As String
 Dim info As String[]  
 Dim ordo As New Integer[]  
 Dim i, j, n, rm, k As Integer
 
 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"
' Va a estrarre informazioni generali (frequenza di campionamento e canali) sul file:
 info = EstraeInfo(s)
 Print "Frequenza di campionamento: "; info[0]; " hertz"
 Print "Numero canali:              "; info[1]
 Print "Bitrate nominale:           "; info[2]; " kbps"
 
 i = InStr(s, "vorbis", 87)
 n = Asc(s, i + Len("vorbis")) - 10
 Print "Vendor:                     "; Mid(s, i + 10, n)
 

 ordo.add(InStr(s, "TITLE="))
 ordo.add(InStr(s, "title="))
 ordo.add(InStr(s, "VERSION="))
 ordo.add(InStr(s, "version="))
 ordo.add(InStr(s, "ALBUM="))
 ordo.add(InStr(s, "VERSION="))
 ordo.add(InStr(s, "TRACKNUMBER="))
 ordo.add(InStr(s, "tracknumber="))
 ordo.add(InStr(s, "ARTIST="))
 ordo.add(InStr(s, "artist="))
 ordo.add(InStr(s, "PERFORMER="))
 ordo.add(InStr(s, "performer="))
 ordo.add(InStr(s, "COPYRIGHT="))
 ordo.add(InStr(s, "copyright="))
 ordo.add(InStr(s, "LICENSE="))
 ordo.add(InStr(s, "license="))
 ordo.add(InStr(s, "ORGANIZATION="))
 ordo.add(InStr(s, "organization="))
 ordo.add(InStr(s, "DESCRIPTION="))
 ordo.add(InStr(s, "description="))
 ordo.add(InStr(s, "GENRE="))
 ordo.add(InStr(s, "genre="))
 ordo.add(InStr(s, "DATE="))
 ordo.add(InStr(s, "date="))
 ordo.add(InStr(s, "LOCATION="))
 ordo.add(InStr(s, "location="))
 ordo.add(InStr(s, "CONTACT="))
 ordo.add(InStr(s, "contact="))
 ordo.add(InStr(s, "COMMENT="))
 ordo.add(InStr(s, "comment="))
 ordo.add(InStr(s, "ISRC="))
 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()

 s2 = Mid(s, ordo[ordo.Max], 255)
 n = InStr(s2, "vorbis") - 1
    
 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] + n
       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


Private Function EstraeInfo(sf As String) As String[]
 
 Dim j As Byte
 Dim fr$, br$ As String
 Dim info$ As New String[]
 
' Estrae la frequenza di campionamento:
 For j = 43 To 41 Step -1
   fr$ &= Hex(Asc(Mid(sf, j, 1)), 2)
 Next
 
 info$.Add(Cstr(Val("&" & fr$)))
   
' Estrae il numero di canali d'uscita:
 info$.Add(CStr(Asc(Mid(sf, 40, 1))))
 
' Estrae il bitrate nominale:
 For j = 51 To 49 Step -1
   br$ &= Hex(Asc(Mid(sf, j, 1)), 2)
 Next
   
 info$.Add(CStr(Val("&" & br$) \ 1000))
   
 Return info$

End


Riferimenti

[1] Vorbis I specification