Registrare il sonoro da una fonte esterna e salvarlo in un file audio mediante il Componente gb.media: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 14: Riga 14:
   Dim primofile As String
   Dim primofile As String
    
    
  primofile = "/tmp/primofile.wav"
  primofile = Temp
  bo = True
    
    
  pl = New MediaPipeline  
  pl = New MediaPipeline  
    
    
  src = New MediaControl(pl, "alsasrc")   
  src = New MediaControl(pl, "alsasrc")   
  aco = New MediaControl(pl, "audioconvert")
  aco = New MediaControl(pl, "audioconvert")
  wen = New MediaControl(pl, "wavenc")
  wen = New MediaControl(pl, "wavenc")
  snk = New MediaControl(pl, "filesink")
  snk = New MediaControl(pl, "filesink")
  snk["location"] = primofile
  snk["location"] = primofile
    
    
  src.LinkTo(aco)
  src.LinkTo(aco)
  aco.LinkTo(wen)
  aco.LinkTo(wen)
  wen.LinkTo(snk)
  wen.LinkTo(snk)
    
    
  pl.Play()
  pl.Play()
    
    
  While bo
  Repeat
    Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
    Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
    Wait 0.001
    Wait 0.01
  Wend
  Until bo
    
    
  Copy primofile To "/tmp/audio.wav"
  Copy primofile To "/tmp/audio.wav"
    
    
  pl.Stop()
  pl.Stop()
  pl.Close()
  pl.Close()
  Print "Termine registrazione"
  Print "Termine registrazione"
  Quit
  Quit
    
    
  '''End'''
  '''End'''
   
   
  '''Public''' Sub Application_Read()
  '''Public''' Sub Application_Read()
    
    
  bo = False
  bo = True
    
    
  '''End'''
  '''End'''
Riga 64: Riga 62:
   Dim primofile As String
   Dim primofile As String
    
    
  primofile = "/tmp/primofile.wav"
  primofile = Temp
  bo = True
    
    
  pl = New MediaPipeline  
  pl = New MediaPipeline  
    
    
  src = New MediaControl(pl, "alsasrc")   
  src = New MediaControl(pl, "alsasrc")   
  aco = New MediaControl(pl, "audioconvert")
  aco = New MediaControl(pl, "audioconvert")
  flt = New MediaFilter(pl, "audio/x-raw,rate=44100,depth=16,channels=2,width=16,signed=true")
  flt = New MediaFilter(pl, "audio/x-raw,rate=44100,depth=16,channels=2,width=16,signed=true")
  wen = New MediaControl(pl, "wavenc")
  wen = New MediaControl(pl, "wavenc")
  snk = New MediaControl(pl, "filesink")
  snk = New MediaControl(pl, "filesink")
  snk["location"] = primofile
  snk["location"] = primofile
    
    
  src.LinkTo(aco)
  src.LinkTo(aco)
  aco.LinkTo(flt)
  aco.LinkTo(flt)
  flt.LinkTo(wen)
  flt.LinkTo(wen)
  wen.LinkTo(snk)
  wen.LinkTo(snk)
    
    
  pl.Play()
  pl.Play()
    
    
  While bo
  Repeat
    Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
    Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
    Wait 0.001
    Wait 0.01
  Wend
  Until bo
  Copy primofile To "/tmp/audio.wav"
    
    
  Copy primofile To "/tmp/audio.wav"
  pl.Stop()
 
  pl.Close()
  pl.Stop()
  Print "Termine registrazione"
  pl.Close()
  Quit
  Print "Termine registrazione"
  Quit
    
    
  '''End'''
  '''End'''
 
  '''Public''' Sub Application_Read()
  '''Public''' Sub Application_Read()
    
    
  bo = False
  bo = True
    
    
  '''End'''
  '''End'''
Riga 135: Riga 131:
    
    
   Repeat
   Repeat
     Write "\rTempo: " & Str(0, 0, 0, pl.Position * 1000)
     Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
     Wait 0.01
     Wait 0.01
   Until bo
   Until bo
Riga 165: Riga 161:
   Dim primofile As String
   Dim primofile As String
    
    
  primofile = "/tmp/primofile.ogg"
  primofile = Temp
  bo = True
    
    
  pl = New MediaPipeline  
  pl = New MediaPipeline  
    
    
  src = New MediaControl(pl, "alsasrc")   
  src = New MediaControl(pl, "alsasrc")   
  aco = New MediaControl(pl, "audioconvert")
  aco = New MediaControl(pl, "audioconvert")
  ven = New MediaControl(pl, "vorbisenc")
  ven = New MediaControl(pl, "vorbisenc")
  omu = New MediaControl(pl, "oggmux")
  omu = New MediaControl(pl, "oggmux")
  snk = New MediaControl(pl, "filesink")
  snk = New MediaControl(pl, "filesink")
  snk["location"] = primofile
  snk["location"] = primofile
    
    
  src.LinkTo(aco)
  src.LinkTo(aco)
  aco.LinkTo(ven)
  aco.LinkTo(ven)
  ven.LinkTo(omu)
  ven.LinkTo(omu)
  omu.LinkTo(snk)
  omu.LinkTo(snk)
    
    
  pl.Play()
  pl.Play()
    
    
  While bo
  Repeat
    Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
    Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
    Wait 0.001
    Wait 0.01
  Wend
  Until bo
  Copy primofile To "/tmp/audio.ogg"
    
    
  Copy primofile To "/tmp/audio.ogg"
  pl.Stop()
 
  pl.Close()
  pl.Stop()
  Print "Termine registrazione"
  pl.Close()
  Quit
  Print "Termine registrazione"
  Quit
    
    
  '''End'''
  '''End'''
   
   
  '''Public''' Sub Application_Read()
  '''Public''' Sub Application_Read()
    
    
  bo = False
  bo = True
    
    
  '''End'''
  '''End'''
Riga 222: Riga 216:
   Dim primofile, mss As String
   Dim primofile, mss As String
    
    
  primofile = "/tmp/primofile"
  primofile = Temp
    
    
  <FONT Color=gray>' ''Imposta il numero di blocchi audio di cui sarà formata la registrazione audio:''</font>
  <FONT Color=gray>' ''Imposta il numero di blocchi audio di cui sarà formata la registrazione audio:''</font>
  dur = 40
  dur = 40
  bs = 44100
  bs = 44100
  canali = 2
  canali = 2
  bit = 16
  bit = 16
  dur_eff = dur * bs * 8 / (bs * canali * bit)
  dur_eff = dur * bs * 8 / (bs * canali * bit)
    
    
  pl = New MediaPipeline  
  pl = New MediaPipeline  
    
    
  src = New MediaControl(pl, "alsasrc")
  src = New MediaControl(pl, "alsasrc")
  src["num-buffers"] = dur
  src["num-buffers"] = dur
  src["blocksize"] = bs
  src["blocksize"] = bs
  enc = New MediaControl(pl, "wavenc")
  enc = New MediaControl(pl, "wavenc")
  snk = New MediaControl(pl, "filesink")
  snk = New MediaControl(pl, "filesink")
  snk["location"] = primofile
  snk["location"] = primofile
      
      
  <FONT Color=gray>' ''Colleghiamo fra loro gli Elementi di "GStreamer":''</font>
  <FONT Color=gray>' ''Colleghiamo fra loro gli Elementi di "GStreamer":''</font>
  src.LinkTo(enc)
  src.LinkTo(enc)
  enc.LinkTo(snk)
  enc.LinkTo(snk)
    
    
  <FONT Color=gray>' ''Avvia la registrazione audio:''</font>
  <FONT Color=gray>' ''Avvia la registrazione audio:''</font>
  pl.Play()
  pl.Play()
    
    
  tm = Now  
  tm = Now  
    
    
  Do
  Do
    i = DateDiff(tm, Now, gb.Millisecond)
    i = DateDiff(tm, Now, gb.Millisecond)
    If i < (dur_eff * 1000) Then
    If i < (dur_eff * 1000) Then
      mss = "\rTempo: " & CStr(Date(0, 0, 0, 0, 0, 0, i))
      mss = "\rTempo: " & CStr(Date(0, 0, 0, 0, 0, 0, i))
    Else
    Else
      pl.Stop()
      pl.Stop()
      pl.Close()
      pl.Close()
      Copy primofile To "/tmp/file.wav"
      Copy primofile To "/tmp/file.wav"
      mss = "\rRegistrazione terminata !"
      mss = "\rRegistrazione terminata !"
      Quit
      Quit
    Endif
    Endif
    Write #File.Out, mss
    Write mss
  Loop
  Loop
    
    
  '''End'''
  '''End'''
Riga 282: Riga 276:
   Dim primofile As String
   Dim primofile As String
    
    
  primofile = "/tmp/primofile.wav"
  primofile = Temp
  bo = True
  pl = New MediaPipeline
    
    
  pl = New MediaPipeline
  src = New MediaControl(pl, "<FONT Color=#B22222>jackaudiosrc</font>")
  src["client-name"] = "Nome_Client"
  src["connect"] = 0
  aco = New MediaControl(pl, "audioconvert")
  flt = New MediaFilter(pl, "audio/x-raw,rate=44100,depth=16,channels=2,width=16,signed=true")
  wen = New MediaControl(pl, "wavenc")
  snk = New MediaControl(pl, "filesink")
  snk["location"] = primofile
    
    
  src = New MediaControl(pl, "<FONT Color=#B22222>jackaudiosrc</font>")
  src.LinkTo(aco)
  src["client-name"] = "Nome_Client"
  aco.LinkTo(flt)
  src["connect"] = 0
  flt.LinkTo(wen)
  aco = New MediaControl(pl, "audioconvert")
  wen.LinkTo(snk)
  flt = New MediaFilter(pl, "audio/x-raw,rate=44100,depth=16,channels=2,width=16,signed=true")
  wen = New MediaControl(pl, "wavenc")
  snk = New MediaControl(pl, "filesink")
  snk["location"] = primofile
    
    
  src.LinkTo(aco)
  pl.Play()
  aco.LinkTo(flt)
  flt.LinkTo(wen)
  wen.LinkTo(snk)
    
    
  pl.Play()
  Repeat
    Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
    Wait 0.01
  Until bo
    
    
  While bo
  Copy primofile To "/tmp/audio.wav"
    Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
    Wait 0.001
  Wend
    
    
  Copy primofile To "/tmp/audio.wav"
  pl.Stop()
 
  pl.Close()
  pl.Stop()
  Print "Termine registrazione"
  pl.Close()
  Quit
  Print "Termine registrazione"
  Quit
    
    
  '''End'''
  '''End'''
   
   
  '''Public''' Sub Application_Read()
  '''Public''' Sub Application_Read()
    
    
  bo = False
  bo = True
    
    
  '''End'''
  '''End'''

Versione delle 19:02, 3 ott 2022

Il Componente gb.media consente mediante appositi plugin di GStreamer di registrare una fonte sonora esterna (ad esempio da un microfono) e salvare, quanto registrato, in un file audio.

Mostriamo di seguito alcuni casi con applicazioni a riga di comando, nei quali per interrompere la registrazione è sufficiente premere il tasto "Invio".


Salvare la registrazione in un file audio WAV (44100 hertz, mono, 16-bit)

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, aco, wen, snk As MediaControl
 Dim primofile As String
  
 primofile = Temp
  
 pl = New MediaPipeline 
  
 src = New MediaControl(pl, "alsasrc")   
 aco = New MediaControl(pl, "audioconvert")
 wen = New MediaControl(pl, "wavenc")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = primofile
  
 src.LinkTo(aco)
 aco.LinkTo(wen)
 wen.LinkTo(snk)
  
 pl.Play()
  
 Repeat
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo
  
 Copy primofile To "/tmp/audio.wav"
  
 pl.Stop()
 pl.Close()
 Print "Termine registrazione"
 Quit
  
End

Public Sub Application_Read()
  
 bo = True
  
End


Salvare la registrazione in un file audio WAV (44100 hertz, stereo, 16-bit)

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, aco, wen, snk As MediaControl
 Dim flt As MediaFilter
 Dim primofile As String
  
 primofile = Temp
  
 pl = New MediaPipeline 
  
 src = New MediaControl(pl, "alsasrc")   
 aco = New MediaControl(pl, "audioconvert")
 flt = New MediaFilter(pl, "audio/x-raw,rate=44100,depth=16,channels=2,width=16,signed=true")
 wen = New MediaControl(pl, "wavenc")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = primofile
  
 src.LinkTo(aco)
 aco.LinkTo(flt)
 flt.LinkTo(wen)
 wen.LinkTo(snk)
  
 pl.Play()
  
 Repeat
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 Copy primofile To "/tmp/audio.wav"
  
 pl.Stop()
 pl.Close()
 Print "Termine registrazione"
 Quit
  
End
 
Public Sub Application_Read()
  
 bo = True
  
End


Salvare la registrazione in un file audio MP3

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, aco, lam, snk As MediaControl
 Dim primofile As String
  
 primofile = Temp

 pl = New MediaPipeline 
  
 src = New MediaControl(pl, "alsasrc")   
 aco = New MediaControl(pl, "audioconvert")
 lam = New MediaControl(pl, "lamemp3enc")
 lam["target"] = BITRATE   ' Imposta il BItrate.
 lam["cbr"] = True         ' Imposta il BItrate "Costante".
 lam["bitrate"] = 192      ' Imposta il valore del BItrate "Costante".
 snk = New MediaControl(pl, "filesink")
 snk["location"] = primofile
  
 src.LinkTo(aco)
 aco.LinkTo(lam)
 lam.LinkTo(snk)
  
 pl.Play()
  
 Repeat
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo
  
 Copy primofile To "/tmp/audio.mp3"
  
 pl.Stop()
 pl.Close()
 Print "Termine registrazione"
 Quit
  
End
 
Public Sub Application_Read()
  
 bo = True
  
End


Salvare la registrazione in un file audio OGG

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, aco, ven, omu, snk As MediaControl
 Dim primofile As String
  
 primofile = Temp
  
 pl = New MediaPipeline 
  
 src = New MediaControl(pl, "alsasrc")   
 aco = New MediaControl(pl, "audioconvert")
 ven = New MediaControl(pl, "vorbisenc")
 omu = New MediaControl(pl, "oggmux")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = primofile
  
 src.LinkTo(aco)
 aco.LinkTo(ven)
 ven.LinkTo(omu)
 omu.LinkTo(snk)
  
 pl.Play()
  
 Repeat
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 Copy primofile To "/tmp/audio.ogg"
  
 pl.Stop()
 pl.Close()
 Print "Termine registrazione"
 Quit
  
End

Public Sub Application_Read()
  
 bo = True
  
End


Impostare preliminarmente la durata della regisrazione audio

Nei precedenti esempi la registrazione audio veniva interrotta arbitrariamente dall'utente. Volendo impostare invece preliminarmente la durata della registrazione audio, bisognerà assegnare i rispettivi valori alle proprietà "num-buffers" e "blocksize" dell'elemento "alsasrc", nonché stabilire la durata del ciclo, previsto nella routine principale del codice, secondo il seguente calcolo:

durata = numero_buffer * dimensione_un_buffer * 8 / (frequenza_di_campionamento * canali * risoluzione_bit)

Così ad esempio: 40 * 44100 * 8 / (44100 * 2 * 16) = 10 secondi


Mostriamo un esempio pratico:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, enc, snk As MediaControl
 Dim tm As Date
 Dim dur, bs, dur_eff, i As Integer
 Dim canali, bit As Byte
 Dim primofile, mss As String
 
 primofile = Temp
 
' Imposta il numero di blocchi audio di cui sarà formata la registrazione audio:
 dur = 40
 bs = 44100
 canali = 2
 bit = 16
 dur_eff = dur * bs * 8 / (bs * canali * bit)
  
 pl = New MediaPipeline 
  
 src = New MediaControl(pl, "alsasrc")
 src["num-buffers"] = dur
 src["blocksize"] = bs
 enc = New MediaControl(pl, "wavenc")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = primofile
   
' Colleghiamo fra loro gli Elementi di "GStreamer":
 src.LinkTo(enc)
 enc.LinkTo(snk)
  
' Avvia la registrazione audio:
 pl.Play()
  
 tm = Now 
  
 Do
   i = DateDiff(tm, Now, gb.Millisecond)
   If i < (dur_eff * 1000) Then
     mss = "\rTempo: " & CStr(Date(0, 0, 0, 0, 0, 0, i))
   Else
     pl.Stop()
     pl.Close()
     Copy primofile To "/tmp/file.wav"
     mss = "\rRegistrazione terminata !"
     Quit
   Endif
   Write mss
 Loop
  
End


Registrare utilizzando il plugin "jackaudiosink" di GStreamer

Per effettuare una registrazione audio è possibile anche creare un interfacciamento tra il programma Gambas e il server audio JACK. Per fare ciò, ci si servirà dell'apposito plugin di GStreamer, chiamato "jackaudiosink".

Ovviamente bisognerà avere l'accortezza di avviare il server Jack (per esempio avviando il programma qjackctl) prima di lanciare il programma Gambas. Successivamente all'avvio del programma bisognerà connettere la porta d'entrata del client, creato dal server Jack e che rappresenta il programma Gambas, e la destinazione (di default il primo canale audio d'uscita disponibile della propria scheda audio).

Mostriamo un semplice esempio di registrazione con un'applicazione a riga di comando, nel quale si genererà alla fine un file WAV:

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, aco, wen, snk As MediaControl
 Dim flt As MediaFilter
 Dim primofile As String
 
 primofile = Temp

 pl = New MediaPipeline 
  
 src = New MediaControl(pl, "jackaudiosrc")
 src["client-name"] = "Nome_Client"
 src["connect"] = 0
 aco = New MediaControl(pl, "audioconvert")
 flt = New MediaFilter(pl, "audio/x-raw,rate=44100,depth=16,channels=2,width=16,signed=true")
 wen = New MediaControl(pl, "wavenc")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = primofile
  
 src.LinkTo(aco)
 aco.LinkTo(flt)
 flt.LinkTo(wen)
 wen.LinkTo(snk)
  
 pl.Play()
  
 Repeat
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo
  
 Copy primofile To "/tmp/audio.wav"
  
 pl.Stop()
 pl.Close()
 Print "Termine registrazione"
 Quit
  
End

Public Sub Application_Read()
  
 bo = True
  
End