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

Da Gambas-it.org - Wikipedia.
 
(6 versioni intermedie di uno stesso utente non sono mostrate)
Riga 2: Riga 2:
  
 
Un possibile codice è il seguente:
 
Un possibile codice è il seguente:
  '''Public''' Sub Main()   
+
  Public Sub Main()   
 
    
 
    
   Dim percorsoFile, s, s2, tag As String
+
   Dim ogg, s As String
   Dim info As String[] 
+
   Dim i, n, c As Integer
  Dim ordo As New Integer[] 
 
  Dim j, rm, k As Integer
 
  Dim n As Byte
 
 
    
 
    
 +
  ogg = "<FONT color=darkgreen>''/percorso/del/file.ogg''</font>" 
 
    
 
    
  percorsoFile = "''/percorso/del/file.ogg''
+
  s = File.Load(ogg)
 
+
<FONT color=gray>' ''Verifica se effettivamente è un file .ogg:''</font>
  s = File.Load(percorsoFile)   
+
  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 ogg:   "; ogg
  If Left(s, 4) <> "OggS" Then Error.Raise("Attenzione ! Il file caricato non è un file OGG !") 
+
  Print "\nDimensione: "; Len(s); " byte"
   
+
  Print "Canali:    "; Asc(s, 40)
  Print "File audio ogg: '"; File.Name(percorsoFile); "'" 
+
  <FONT color=gray>' ''Estrae la frequenza di campionamento:''</font>
  Print "\nDimensione: "; Len(s); " byte"
+
  Print "Frequenza"; Val("&" & Estrazione(s, 44)); " hertz"
+
<FONT color=gray>' ''Estrae il bitrate nominale:''</font>
  <FONT color=gray>' ''Estrae informazioni generali (frequenza di campionamento e canali) sul file:''</font>
+
  Print "Bitrate     "; Val("&" & Estrazione(s, 52)) \ 1000; " Kbps"
  info = EstraeInfo(s)
 
  Print "Frequenza di campionamento = hz "; info[0]
 
  Print "Canali = "; info[1]
 
  Print "Bitrate nominale = "; info[2]; " kbps"
 
 
 
 
    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 
+
<FONT color=gray>' ''Individua il secondo testo "vorbis" nel file:''</font>
    If ordo[j] = 0 Then 
+
  i = InStr(s, "vorbis", InStr(s, "vorbis") + 5)
      ordo.Remove(j)
 
      Inc rm 
 
      Dec j 
 
    Endif 
 
    Inc j 
 
  Wend 
 
 
    
 
    
  ordo.Sort()
+
  <FONT color=gray>' ''Individua il byte che indica il numero di caratteri che compongono la stringa del "Vendor":''</font>
   
+
  n = Asc(s, i + 6)
  s2 = Mid(s, ordo[ordo.Max], 255)
 
  n = InStr(s2, "vorbis") - 1
 
   
 
  Print "\n  == T A G ==" 
 
 
 
  If ordo.Count > 0 Then        <FONT color=gray>' ''Se è presente almeno un TAG''</font>
 
   
 
    For j = 0 To ordo.Max 
 
 
    
 
    
    k = ordo[j] 
+
<FONT color=gray>' ''Avanza con l'indicatore:''</font>
 +
  i += 10
 
    
 
    
    While k < ordo[ordo.max] + n
+
  <FONT color=gray>' ''Legge la stringa del "Vendor":''</font>
       
+
  Print "Vendor:    "; Mid(s, i, n)
      If j < ordo.Max Then 
+
  Print "\nCommenti:"
  <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 
 
          tag &= Mid(s, k, 1) 
 
        Else 
 
          tag &= " "
 
        Endif 
 
      Else 
 
<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 
 
          tag &= Mid(s, k, 1) 
 
        Else 
 
          tag &= " "
 
        Endif 
 
 
    
 
    
      Endif  
+
  <FONT color=gray>' ''Avanza con l'indicatore:''</font>
       
+
  i += n
      Inc k 
 
 
    
 
    
    Wend  
+
  <FONT color=gray>' ''Individua il byte che indica la quantità di "commenti" presenti nel file ogg:''</font>
 +
  n = Asc(s, i)
 +
  If n = 0 Then Quit
 
    
 
    
    Print tag  
+
  <FONT color=gray>' ''Avanza con l'indicatore:''</font>
    tag = Null 
+
  i += 4
     
+
  <FONT color=gray>' ''Individua il byte che indica il numero di caratteri che compongono la stringa del 1° "Commento":''</font>
  Next  
+
  c = Asc(s, i)
   
 
  Else 
 
    Print "Assenti !"
 
  Endif 
 
 
    
 
    
  '''End'''
+
  <FONT color=gray>' ''Legge i "commenti":''</font>
 +
  Repeat
 +
<FONT color=gray>' ''Avanza con l'indicatore:''</font>
 +
    i += 4
 +
<FONT color=gray>' ''Legge la stringa di caratteri del "Commento":''</font>
 +
    Print Mid(s, i, c)
 +
<FONT color=gray>' ''Avanza con l'indicatore:''</font>
 +
    i += c
 +
<FONT color=gray>' ''Individua il byte che indica il numero di caratteri che compongono la stringa del "Commento":''</font>
 +
    c = Asc(s, i)
 +
    Dec n
 +
  Until n = 0
 +
 
 +
End
 
   
 
   
 
   
 
   
  '''Private''' Function EstraeInfo(sf As String) As String[]
+
  Private Function Estrazione(t As String, byte As Integer) As String
 
    
 
    
   Dim j As Byte
+
   Dim rit As String
   Dim fr$, br$ As String
+
   Dim n As Integer
   Dim info$ As New String[]
+
 
 +
  For n = byte To byte - 3 Step -1
 +
    rit &= Hex(Asc(t, n), 2)
 +
  Next
 +
   
 +
   Return rit
 
    
 
    
 
+
  End
  <FONT color=gray>' ''Estrae la frequenza di campionamento:''</font>
+
 
    For j = 43 To 41 Step -1
 
      fr$ &= Hex(Asc(Mid(sf, j, 1)), 2)
 
    Next
 
 
 
    info$.Add(Cstr(Val("&" & fr$)))
 
   
 
<FONT color=gray>' ''Estrae il numero di canali d'uscita:''</font>
 
    info$.Add(CStr(Asc(Mid(sf, 40, 1))))
 
 
<FONT color=gray>' ''Estrae il bitrate nominale:''</font>
 
    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=
 
=Riferimenti=
[1] [http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html Vorbis I specification]
+
* http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html
 +
* https://kid3.sourceforge.io/kid3_en.html#tag3

Versione attuale delle 04:07, 24 nov 2023

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 ogg, s As String
 Dim i, n, c As Integer
 
 ogg = "/percorso/del/file.ogg"  
 
 s = File.Load(ogg)
' Verifica se effettivamente è un file .ogg:
 If Left(s, 4) <> "OggS" Then Error.Raise("Attenzione ! Il file caricato non è un file OGG !")  
    
 Print "File ogg:   "; ogg
 Print "\nDimensione: "; Len(s); " byte"
 Print "Canali:     "; Asc(s, 40)
' Estrae la frequenza di campionamento:
 Print "Frequenza:  "; Val("&" & Estrazione(s, 44)); " hertz"
' Estrae il bitrate nominale:
 Print "Bitrate     "; Val("&" & Estrazione(s, 52)) \ 1000; " Kbps"
 
' Individua il secondo testo "vorbis" nel file:
 i = InStr(s, "vorbis", InStr(s, "vorbis") + 5)
 
' Individua il byte che indica il numero di caratteri che compongono la stringa del "Vendor":
 n = Asc(s, i + 6)
 
' Avanza con l'indicatore:
 i += 10
 
' Legge la stringa del "Vendor":
 Print "Vendor:     "; Mid(s, i, n)
 Print "\nCommenti:"
 
' Avanza con l'indicatore:
 i += n
 
' Individua il byte che indica la quantità di "commenti" presenti nel file ogg:
 n = Asc(s, i)
 If n = 0 Then Quit
 
' Avanza con l'indicatore:
 i += 4
' Individua il byte che indica il numero di caratteri che compongono la stringa del 1° "Commento":
 c = Asc(s, i)
 
' Legge i "commenti":
 Repeat
' Avanza con l'indicatore:
   i += 4
' Legge la stringa di caratteri del "Commento":
   Print Mid(s, i, c)
' Avanza con l'indicatore:
   i += c
' Individua il byte che indica il numero di caratteri che compongono la stringa del "Commento":
   c = Asc(s, i)
   Dec n
 Until n = 0
  
End


Private Function Estrazione(t As String, byte As Integer) As String
 
 Dim rit As String
 Dim n As Integer
  
 For n = byte To byte - 3 Step -1
   rit &= Hex(Asc(t, n), 2)
 Next
   
 Return rit
 
End



Riferimenti