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 |
− | |||
+ | percorsoFile = "<FONT color=gray>''/percorso/del/file.ogg''</font>" | ||
− | + | 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>' '' | + | Print "File audio ogg: "; File.Name(percorsoFile) |
− | + | Print "\nDimensione: "; Len(s); " byte" | |
− | + | <FONT color=gray>' ''Va a estrarre informazioni generali (frequenza di campionamento e canali) sul file:''</font> | |
− | + | 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) | ordo.Remove(j) | ||
Inc rm | Inc rm | ||
Dec j | 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 <FONT color=gray>' ''Se è presente almeno un TAG''</font> | |
− | + | For j = 0 To ordo.Max | |
− | + | k = ordo[j] | |
− | + | 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 | |
− | + | 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> | <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''' | '''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 | |
− | + | 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> | <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> | <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''' | '''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