Differenze tra le versioni di "Conoscere la durata di un file audio mediante il Componente gb.media"

Da Gambas-it.org - Wikipedia.
 
(8 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per conoscere la durata di un file audio, il Componente ''gb.media'' fornisce la proprietà .''Duration'' della Classe ''MediaPlayer''. In particolare questa proprietà restituisce un valore di tipo ''Float'' che rappresenta la durata del brano musicale espresso in secondi.
+
Per conoscere la durata di un file audio, il Componente ''gb.media'' fornisce la Proprietà .''Duration'' della Classe ''MediaPlayer''. In particolare questa Proprietà restituisce un valore di tipo ''Float'' che rappresenta la durata del brano musicale espresso in secondi.
  
Poiché tale proprietà ritorna più precisamente la durata dei dati processati, essa potrà essere utilizzabile solo successivamente all'attivazione della funzione ''.Play( )'' .
+
Poiché tale proprietà ritorna più precisamente la durata dei dati processati, essa potrà essere utilizzabile solo successivamente all'attivazione del Metodo ".Play()".
  
 
+
===Usare la Classe "MediaPlayer"===
Mostriamo un essenziale esempio:
+
Mostriamo un essenziale esempio usando la Classe "MediaPlayer":
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
 
   Dim mp As MediaPlayer
 
   Dim mp As MediaPlayer
 
    
 
    
  With mp = New MediaPlayer
+
  With mp = New MediaPlayer
    .URL = Media.URL("<FONT Color=gray>''/percorso/del/file/audio''</font>")
+
    .URL = Media.URL("<FONT Color=gray>''/percorso/del/file/audio''</font>")
    .Play
+
    .Audio.Mute = True
  End With
+
    .Play
 
+
    Repeat    <FONT Color=gray>' ''Resta in attesa fino a che non viene conosciuta la durata del brano audio''</font>
  Do
+
      Wait 0.01
    Sleep 0.01
+
    Until mp.Duration > 0.0
  Loop Until mp.Duration > 0
+
    Print "Durata del brano: " & CStr(Time(0, 0, 0, mp.Duration * 1000))
 
+
    .Stop()
  Print "Durata del brano: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Duration * 1000))
+
    .Close()
 
+
  End With
  mp.Stop
 
 
    
 
    
 
  '''End'''
 
  '''End'''
 +
 +
===Usare la Classe "MediaPipeline"===
 +
Per utilizzare invece la Proprietà ".Duration" della Classe ''MediaPipeline'' si rinvia agli esempi presenti nella seguente pagina:
 +
<BR>[[Eseguire i file audio mediante la Classe ''MediaPipeline'' del componente gb.media]]
 +
 +
 +
==Conoscere a durata di un file audio convertendolo preliminarmente in formato WAV==
 +
Si potrà conoscere la durata di un file audio, che non sia di formato WAV, con una procedura complessa convertendolo innanzitutto in detto formato audio e successivamente leggendo il valore del ''Byte-Rate'' al byte d'indice 28 del blocco ''header'' del file WAV generato.
 +
Private bo As Boolean
 +
 +
 +
Public Sub Main()
 +
 +
  Dim s As String
 +
  Dim fl As File
 +
  Dim br, d As Integer
 +
  Dim bb As Byte[]
 +
 +
  If Exist("/tmp/file.wav") Then Kill "/tmp/file.wav"
 +
 +
  s = "<FONT Color=gray>''/percorso/del/file/audio''</font>"
 +
 +
  Conversione_in_WAV(s)
 +
 +
  fl = Open "/tmp/file.wav" For Read
 +
 +
<FONT Color=gray>' ''Legge il Byte-Rate del file WAV:''</font>"
 +
  Seek #fl, 28
 +
  Read #fl, br
 +
 +
<FONT Color=gray>' ''Ottiene la durata del file audio:''</font>"
 +
  Print "Dutata: "; Time(0, 0, 0, (Lof(fl) \ br) * 1000)
 +
 +
End
 +
 +
Private Procedure Conversione(s As String)
 +
 +
  Dim pl As MediaPipeline
 +
  Dim src, map, con, mad, que, wav, snk As MediaControl
 +
  Dim fil As MediaFilter
 +
  Dim temporaneo As String
 +
 +
  temporaneo = Temp
 +
 +
  pl = New MediaPipeline As "PLine"
 +
 +
  src = New MediaControl(pl, "filesrc")
 +
  src["location"] = s
 +
  map = New MediaControl(pl, "decodebin")
 +
  con = New MediaControl(pl, "audioconvert")
 +
  wav = New MediaControl(pl, "wavenc")
 +
  snk = New MediaControl(pl, "filesink")
 +
  snk["location"] = temporaneo
 +
 +
  src.LinkTo(map)
 +
  map.LinkLaterTo(con)
 +
  con.LinkTo(wav)
 +
  wav.LinkTo(snk)
 +
 +
  pl.Play()
 +
 +
  Repeat
 +
    Wait 0.01
 +
  Until bo
 +
 +
  Copy temporaneo To "/tmp/file.wav"
 +
  pl.Stop
 +
  pl.Close
 +
 +
End
 +
 +
Public Sub PLine_End()
 +
 +
  bo = True
 +
 +
End
 +
 +
 +
 +
=Note=
 +
Si è notato che la Proprietà ".Duration" non riesce a conoscere la durata audio di alcuni file MP3.

Versione attuale delle 10:03, 2 giu 2023

Per conoscere la durata di un file audio, il Componente gb.media fornisce la Proprietà .Duration della Classe MediaPlayer. In particolare questa Proprietà restituisce un valore di tipo Float che rappresenta la durata del brano musicale espresso in secondi.

Poiché tale proprietà ritorna più precisamente la durata dei dati processati, essa potrà essere utilizzabile solo successivamente all'attivazione del Metodo ".Play()".

Usare la Classe "MediaPlayer"

Mostriamo un essenziale esempio usando la Classe "MediaPlayer":

Public Sub Main()
 
 Dim mp As MediaPlayer
 
 With mp = New MediaPlayer
   .URL = Media.URL("/percorso/del/file/audio")
   .Audio.Mute = True
   .Play
   Repeat     ' Resta in attesa fino a che non viene conosciuta la durata del brano audio 
     Wait 0.01
   Until mp.Duration > 0.0
   Print "Durata del brano: " & CStr(Time(0, 0, 0, mp.Duration * 1000))
   .Stop()
   .Close()
 End With
  
End

Usare la Classe "MediaPipeline"

Per utilizzare invece la Proprietà ".Duration" della Classe MediaPipeline si rinvia agli esempi presenti nella seguente pagina:
Eseguire i file audio mediante la Classe ''MediaPipeline'' del componente gb.media


Conoscere a durata di un file audio convertendolo preliminarmente in formato WAV

Si potrà conoscere la durata di un file audio, che non sia di formato WAV, con una procedura complessa convertendolo innanzitutto in detto formato audio e successivamente leggendo il valore del Byte-Rate al byte d'indice 28 del blocco header del file WAV generato.

Private bo As Boolean


Public Sub Main()

 Dim s As String
 Dim fl As File
 Dim br, d As Integer
 Dim bb As Byte[]

 If Exist("/tmp/file.wav") Then Kill "/tmp/file.wav"

 s = "/percorso/del/file/audio"

 Conversione_in_WAV(s)

 fl = Open "/tmp/file.wav" For Read 

' Legge il Byte-Rate del file WAV:"
 Seek #fl, 28
 Read #fl, br

' Ottiene la durata del file audio:"
 Print "Dutata: "; Time(0, 0, 0, (Lof(fl) \ br) * 1000)

End

Private Procedure Conversione(s As String)

 Dim pl As MediaPipeline
 Dim src, map, con, mad, que, wav, snk As MediaControl
 Dim fil As MediaFilter
 Dim temporaneo As String

 temporaneo = Temp

 pl = New MediaPipeline As "PLine"

 src = New MediaControl(pl, "filesrc")
 src["location"] = s
 map = New MediaControl(pl, "decodebin")
 con = New MediaControl(pl, "audioconvert")
 wav = New MediaControl(pl, "wavenc")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = temporaneo

 src.LinkTo(map)
 map.LinkLaterTo(con)
 con.LinkTo(wav)
 wav.LinkTo(snk)

 pl.Play()

 Repeat
   Wait 0.01
 Until bo

 Copy temporaneo To "/tmp/file.wav"
 pl.Stop
 pl.Close

End

Public Sub PLine_End()

 bo = True

End


Note

Si è notato che la Proprietà ".Duration" non riesce a conoscere la durata audio di alcuni file MP3.