Calcolare la durata di un file MP3 con le sole risorse native di Gambas

Da Gambas-it.org - Wikipedia.

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: