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

Da Gambas-it.org - Wikipedia.
 
(2 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 i, j, n, rm, k As Integer
 
 
    
 
    
   percorsoFile = "<FONT color=gray>''/percorso/del/file.ogg''</font>"   
+
   ogg = "<FONT color=darkgreen>''/percorso/del/file.ogg''</font>"   
 
    
 
    
   s = File.Load(percorsoFile)
+
   s = File.Load(ogg)
   
 
 
  <FONT color=gray>' ''Verifica se effettivamente è un file .ogg:''</font>
 
  <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 !")   
 
   If Left(s, 4) <> "OggS" Then Error.Raise("Attenzione ! Il file caricato non è un file OGG !")   
 
      
 
      
   Print "File audio ogg:             "; File.Name(percorsoFile)
+
   Print "File ogg:   "; ogg
   Print "\nDimensione:                 "; Len(s); " byte"
+
   Print "\nDimensione: "; Len(s); " byte"
  <FONT color=gray>' ''Va a estrarre informazioni generali (frequenza di campionamento e canali) sul file:''</font>
+
  Print "Canali:    "; Asc(s, 40)
  info = EstraeInfo(s)
+
  <FONT color=gray>' ''Estrae la frequenza di campionamento:''</font>
   Print "Frequenza di campionamento: "; info[0]; " hertz"
+
   Print "Frequenza: "; Val("&" & Estrazione(s, 44)); " hertz"
   Print "Numero canali:              "; info[1]
+
<FONT color=gray>' ''Estrae il bitrate nominale:''</font>
   Print "Bitrate nominale:           "; info[2]; " kbps"
+
   Print "Bitrate    "; Val("&" & Estrazione(s, 52)) \ 1000; " Kbps"
 +
    
 +
<FONT color=gray>' ''Individua il secondo testo "vorbis" nel file:''</font>
 +
  i = InStr(s, "vorbis", InStr(s, "vorbis") + 5)
 
    
 
    
  i = InStr(s, "vorbis", 87)
+
<FONT color=gray>' ''Individua il byte che indica il numero di caratteri che compongono la stringa del "Vendor":''</font>
   If i > 0 then
+
   n = Asc(s, i + 6)
    n = Asc(s, i + Len("vorbis"))
 
    Print "Vendor:                    "; Mid(s, i + 10, n)
 
  Endif
 
 
    
 
    
 +
<FONT color=gray>' ''Avanza con l'indicatore:''</font>
 +
  i += 10
 
    
 
    
  ordo.add(InStr(s, "TITLE="))
+
<FONT color=gray>' ''Legge la stringa del "Vendor":''</font>
  ordo.add(InStr(s, "title="))
+
   Print "Vendor:    "; Mid(s, i, n)
  ordo.add(InStr(s, "VERSION="))
+
   Print "\nCommenti:"
  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>' ''Avanza con l'indicatore:''</font>
    If ordo[j] = 0 Then 
+
   i += n
      ordo.Remove(j) 
 
      Inc rm 
 
      Dec j 
 
    Endif 
 
    Inc j 
 
   Wend 
 
 
    
 
    
  ordo.Sort()
+
  <FONT color=gray>' ''Individua il byte che indica la quantità di "commenti" presenti nel file ogg:''</font>
   
+
   n = Asc(s, i)
  s2 = Mid(s, ordo[ordo.Max], 255)
+
   If n = 0 Then Quit
   n = InStr(s2, "vorbis") - 1
 
   
 
   Print "\n == T A G ==
 
 
    
 
    
  If ordo.Count > 0 Then        <FONT color=gray>' ''Se è presente almeno un TAG''</font>
+
<FONT color=gray>' ''Avanza con l'indicatore:''</font>
    For j = 0 To ordo.Max 
+
  i += 4
      k = ordo[j] 
+
  <FONT color=gray>' ''Individua il byte che indica il numero di caratteri che compongono la stringa del 1° "Commento":''</font>
      While k < ordo[ordo.max] + n
+
  c = Asc(s, i)
        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>
 
          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
 
        Inc k 
 
      Wend 
 
      Print tag 
 
      tag = Null
 
    Next
 
  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 fr$, br$ As String
 
  Dim info$ As New String[]
 
 
    
 
    
<FONT color=gray>' ''Estrae la frequenza di campionamento:''</font>
+
  Dim rit As String
   For j = 43 To 41 Step -1
+
  Dim n As Integer
     fr$ &= Hex(Asc(Mid(sf, j, 1)), 2)
+
 
 +
   For n = byte To byte - 3 Step -1
 +
     rit &= Hex(Asc(t, n), 2)
 
   Next
 
   Next
 
 
  info$.Add(Cstr(Val("&" & fr$)))
 
 
      
 
      
<FONT color=gray>' ''Estrae il numero di canali d'uscita:''</font>
+
   Return rit
   info$.Add(CStr(Asc(Mid(sf, 40, 1))))
 
 
    
 
    
  <FONT color=gray>' ''Estrae il bitrate nominale:''</font>
+
  End
  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