Differenze tra le versioni di "Calcolare la durata di un file MP3 con le sole risorse native di Gambas"
(Creata pagina con "=Conoscere la durata di un file MP3 codificato con bitrate costante= Per calcolare la durata di un file MP3 con bitrate '''costante''', sia esso "mono" che "stereo", si effett...") |
|||
Riga 19: | Riga 19: | ||
Dim dur As Integer | Dim dur As Integer | ||
− | fileMP3 = "<FONT color= | + | fileMP3 = "<FONT color=darkgreen>''/percorso/del/file.mp3''</font>" |
Print "File audio mp3: "; Quote(File.Name(fileMP3)) | Print "File audio mp3: "; Quote(File.Name(fileMP3)) | ||
dati = File.Load(fileMP3) | dati = File.Load(fileMP3) | ||
Riga 235: | Riga 235: | ||
End | End | ||
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] Vedere anche le seguenti pagine: | ||
+ | * [[La struttura di un file MPEG]] | ||
+ | * [[Calcolare il bitrate di un file MP3]] | ||
+ | * [[Conoscere la durata di un file audio mediante il Componente gb.media]] |
Versione attuale delle 16:02, 16 nov 2023
Conoscere la durata di un file MP3 codificato con bitrate costante
Per calcolare la durata di un file MP3 con bitrate costante, sia esso "mono" che "stereo", si effettuerà il seguente calcolo:
durata = (dimMp3 / bitrate) * 8
laddove:
- dimMp3 è la dimensione del file MP3 in byte;
- bitrate è il bitrate (bps) del file MP3.
- durata è dunque la durata del file MP3 espressa in secondi.
Se il valore della dimensione del file MP3 è espresso in "byte", come di consueto, poiché il valore dl bitrate è invece espresso in "bit", non sussiste coerenza ed uniformità di unità di misura fra i due valori: la dimensione del file è espressa in "Byte", mentre il bitrate è espresso in "bit". Bisognerà, allora, moltiplicare per "8" il risultato della divisione fra dimMp3 e bitrate (come appunto abbiamo mostrato all'inizio); oppure si dovrà trasformare in "bit" il valore della dimensione del file MP3 moltiplicandolo per "8", e dividendo infine il risultato per il bitrate:
durata = (dimMp3 * 8) / bitrate
Ovviamente se invece del "bitrate per secondo" (bps) si userà il valore espresso in "Kilobit per secondo" (Kbps) il risultato delle suddette espressioni andrà diviso per 1000:
durata = ((dimMp3 / Kbps) * 8) / 1000
Questa modalità di calcolo della durata del file MP3 funziona soltanto se il file è codificato con un bitrate costante (CBR).
Mostriamo di seguito un esempio pratico utilizzando le sole risorse native di Gambas.
Public Sub Main() Dim fileMP3, dati As String Dim dur As Integer fileMP3 = "/percorso/del/file.mp3" Print "File audio mp3: "; Quote(File.Name(fileMP3)) dati = File.Load(fileMP3) Print "\nDimensione: "; Len(dati); " byte" ' Invoca la funzione per ottenere la durata del file audio MP3: dur = DurataMP3(dati) Print "Durata: "; Time(0, 0, 0, dur) End Private Function DurataMP3(s As String) As Integer Dim ver_mp3, layer As String Dim j, durata As Integer Dim vB, lB, brB As Byte Dim bitrate As Short For j = 1 To Len(s) - 1 ' Individua il 1° byte dell'header del frame audio MPEG del file mp3 caricato: If (Asc(s, j) == &FF) And (Asc(s, j + 1) > &F1) And (Asc(s, j + 2) > &0F) Then ' Individua il 2° byte dell'header per estrarre le seguenti informazioni generali sul file mp3: ' - vesione MPEG; ' - layer. ' I primi 3 bit più significativi (tutti posti a 1) appartengono con quelli del 1° byte all'identificazione dell'header. ' Viene individuata la versione del file mp3: vB = Asc(s, j + 1) And 24 Select Case vB Case 0 ver_mp3 = "2.5" Case 16 ver_mp3 = "2" Case 24 ver_mp3 = "1" End Select ' Viene individuato il "Layer" del file mp3: lB = Asc(s, j + 1) And 6 Select Case lB Case 2 layer = "III" Case 4 layer = "II" Case 6 layer = "I" End Select Print "Versione MPEG = "; ver_mp3, "Layer = "; layer ' Si analizza, quindi, il terzo byte per estrarre il "bitrate" del file mp3. Questa informazione è condizionata dalla versione e dal layer del file MPEG. brB = Asc(s, j + 2) And 240 bitrate = EstraeBitRate(ver_mp3, layer, brB) Exit Endif Next ' Formula per calcolare la durata di un file audio MP3: durata = Fix((Len(s) / bitrate) * 8) Print "BitRate = "; bitrate; " kbps" Return durata End Private Function EstraeBitRate(Vmpeg As String, layB As String, bitB As Byte) As Short Dim velCamp As Short If Vmpeg = "1" Then ' Nel caso di Mpeg vers. 1 Select Case layB ' Verifica il Layer Case "I" velCamp = bitB * 2 Case "II" Select Case bitB Case 16 velCamp = 32 Case 32 velCamp = 48 Case 48 velCamp = 56 Case 64 velCamp = 64 Case 80 velCamp = 80 Case 96 velCamp = 96 Case 112 velCamp = 112 Case 128 velCamp = 128 Case 144 velCamp = 160 Case 160 velCamp = 192 Case 176 velCamp = 224 Case 192 velCamp = 256 Case 208 velCamp = 320 Case 224 velCamp = 384 End Select Case "III" Select Case bitB Case 16 velCamp = 32 Case 32 velCamp = 40 Case 48 velCamp = 48 Case 64 velCamp = 56 Case 80 velCamp = 64 Case 96 velCamp = 80 Case 112 velCamp = 96 Case 128 velCamp = 112 Case 144 velCamp = 128 Case 160 velCamp = 160 Case 176 velCamp = 192 Case 192 velCamp = 224 Case 208 velCamp = 256 Case 224 velCamp = 320 End Select End Select Else Select Case layB ' Verifica il Layer Case "I" Select Case bitB Case 16 velCamp = 32 Case 32 velCamp = 48 Case 48 velCamp = 56 Case 64 velCamp = 64 Case 80 velCamp = 80 Case 96 velCamp = 96 Case 112 velCamp = 112 Case 128 velCamp = 128 Case 144 velCamp = 144 Case 160 velCamp = 160 Case 176 velCamp = 176 Case 192 velCamp = 192 Case 208 velCamp = 224 Case 224 velCamp = 256 End Select Case "II" To "III" Select Case bitB Case 16 velCamp = 8 Case 32 velCamp = 16 Case 48 velCamp = 24 Case 64 velCamp = 32 Case 80 velCamp = 40 Case 96 velCamp = 48 Case 112 velCamp = 56 Case 128 velCamp = 64 Case 144 velCamp = 80 Case 160 velCamp = 96 Case 176 velCamp = 112 Case 192 velCamp = 128 Case 208 velCamp = 144 Case 224 velCamp = 320 End Select End Select Endif Return velCamp End
Note
[1] Vedere anche le seguenti pagine: