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

Da Gambas-it.org - Wikipedia.
Riga 11: Riga 11:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
Riga 45: Riga 45:
 
   Quit
 
   Quit
 
    
 
    
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Application_Read()
+
   
 +
Public Sub Application_Read()
 
    
 
    
 
   bo = True
 
   bo = True
 
    
 
    
  '''End'''
+
  End
  
  
Riga 58: Riga 59:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
Riga 64: Riga 65:
 
   Dim flt As MediaFilter
 
   Dim flt As MediaFilter
 
   Dim temporaneo As String
 
   Dim temporaneo As String
 
+
 
   temporaneo = Temp
 
   temporaneo = Temp
 
    
 
    
Riga 95: Riga 96:
 
   Quit
 
   Quit
 
    
 
    
  '''End'''
+
  End
 
+
  '''Public''' Sub Application_Read()
+
 +
  Public Sub Application_Read()
 
    
 
    
 
   bo = True
 
   bo = True
 
    
 
    
  '''End'''
+
  End
  
  
Riga 110: Riga 112:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
+
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
   Dim src, aco, lam, snk As MediaControl
 
   Dim src, aco, lam, snk As MediaControl
Riga 147: Riga 149:
 
   Quit
 
   Quit
 
    
 
    
  '''End'''
+
  End
 
+
  '''Public''' Sub Application_Read()
+
 +
  Public Sub Application_Read()
 
    
 
    
 
   bo = True
 
   bo = True
 
    
 
    
  '''End'''
+
  End
  
  
Riga 160: Riga 163:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
+
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
   Dim src, aco, ven, omu, snk As MediaControl
 
   Dim src, aco, ven, omu, snk As MediaControl
Riga 196: Riga 199:
 
   Quit
 
   Quit
 
    
 
    
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub Application_Read()
+
  Public Sub Application_Read()
 
    
 
    
 
   bo = True
 
   bo = True
 
    
 
    
  '''End'''
+
  End
  
  
Riga 211: Riga 215:
  
 
Mostriamo un esempio pratico:
 
Mostriamo un esempio pratico:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
+
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
   Dim src, enc, snk As MediaControl
 
   Dim src, enc, snk As MediaControl
Riga 262: Riga 266:
 
   Loop
 
   Loop
 
    
 
    
  '''End'''
+
  End
  
  
Riga 293: Riga 297:
 
<BR>1) la parte del nome "alsa_<B>output</b>", fa sì che saranno registrati i dati provenienti dall''''uscita''' sonora della scheda audio;
 
<BR>1) la parte del nome "alsa_<B>output</b>", fa sì che saranno registrati i dati provenienti dall''''uscita''' sonora della scheda audio;
  
2) la parte "0000_00_14.2" della stringa di informazioni, ottenute e riportate sopra a titolo esemplificativo, può essere recuperata anche leggendo il seguente file di sistema: "/dev/snd/by-path".
+
2) la parte "pci-0000_00_14.2" della stringa di informazioni, ottenute e riportate sopra a titolo esemplificativo, può essere recuperata anche leggendo il seguente file di sistema: "/dev/snd/by-path".
 
<BR>In particolare utilizzeremo il nome del Monitor della sorgente audio di ALSA riportato dalla seconda riga, ossia:
 
<BR>In particolare utilizzeremo il nome del Monitor della sorgente audio di ALSA riportato dalla seconda riga, ossia:
   '''alsa_output.pci-0000_00_14.2.analog-stereo'''
+
   FONT COLOR=darkgreen>'''alsa_output.pci-0000_00_14.2.analog-stereo'''</font>
 
Mostriamo un esempio pratico a "riga di comando", con il quale si otterrà un file audio finale del formato MP3:
 
Mostriamo un esempio pratico a "riga di comando", con il quale si otterrà un file audio finale del formato MP3:
 
  Private Const QUALITY As String = "quality"
 
  Private Const QUALITY As String = "quality"
Riga 410: Riga 414:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
+
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
   Dim src, aco, wen, snk As MediaControl
 
   Dim src, aco, wen, snk As MediaControl
Riga 449: Riga 453:
 
   Quit
 
   Quit
 
    
 
    
  '''End'''
+
  End
 +
 +
 +
Public Sub Application_Read()
 
   
 
   
'''Public''' Sub Application_Read()
 
 
 
 
   bo = True
 
   bo = True
 
+
  '''End'''
+
  End

Versione delle 15:46, 25 ott 2023

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 ".


Usare il plugin "alsasrc" di GStreamer per leggere i dati dalla scheda audio

Nei seguenti esempi, per catturare sorgenti audio, useremo il plugin "alsasrc" di GStreamer, che legge i dati dalla scheda audio usando l'API di ALSA.

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 temporaneo As String
  
 temporaneo = 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"] = temporaneo
  
 src.LinkTo(aco)
 aco.LinkTo(wen)
 wen.LinkTo(snk)
  
 pl.Play()
  
 While Not bo
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Wend
  
 Copy temporaneo 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 temporaneo As String

 temporaneo = 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"] = temporaneo
  
 src.LinkTo(aco)
 aco.LinkTo(flt)
 flt.LinkTo(wen)
 wen.LinkTo(snk)
  
 pl.Play()
  
 While Not bo
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Wend

 Copy temporaneo 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 Const QUALITY As String = "quality"
Private Const BITRATE As String = "bitrate"
Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, aco, lam, snk As MediaControl
 Dim temporaneo As String
  
 temporaneo = 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"] = temporaneo
  
 src.LinkTo(aco)
 aco.LinkTo(lam)
 lam.LinkTo(snk)
  
 pl.Play()
  
 While Not bo
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Wend
  
 Copy temporaneo 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 temporaneo As String
  
 temporaneo = 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"] = temporaneo
  
 src.LinkTo(aco)
 aco.LinkTo(ven)
 ven.LinkTo(omu)
 omu.LinkTo(snk)
  
 pl.Play()
  
 While Not bo
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Wend

 Copy temporaneo 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 registrazione 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 temporaneo, mss As String
 
 temporaneo = 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"] = temporaneo
   
' 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: " & Str(Time(0, 0, 0, pl.Position * 1000))
     Wait 0.01
   Else
     pl.Stop()
     pl.Close()
     Copy primofile To "/tmp/file.wav"
     mss = "\rRegistrazione terminata !"
     Quit
   Endif
   Write mss
 Loop
  
End


Usare il plugin "pulsesrc" di GStreamer per leggere i dati dalla scheda audio

Nei seguenti esempi useremo il plugin "pulsesrc" di GStreamer, per catturare dati dalla scheda audio. specificando nel contempo anche il nome del dispositivo audio utilizzato.

Registrare i dati in "Uscita" della scheda audio

Per conoscere il nome del dispositivo audio disponibile, è sufficiente lanciare da terminale la seguente riga di comando:

~$ pactl list sinks

che restituirà una serie di informazioni, le prime delle quali saranno simili a quanto segue:

 sink #0
       Stato: SUSPENDED
       Nome: alsa_output.pci-0000_00_14.2.analog-stereo
       Descrizione: Audio interno Stereo analogico
       Driver: module-alsa-card.c
       Specifica di campionamento: s16le ch 2 44100 Hz
       Mappa dei canali: front-left,front-right
       Modulo di appartenenza: 7
       Muto: no
       Volume: front-left: 45773 /  70% / -9,35 dB,   front-right: 45773 /  70% / -9,35 dB
               bilanciamento 0,00
       Volume base: 65536 / 100% / 0,00 dB
       Monitor della sorgente: alsa_output.pci-0000_00_14.2.analog-stereo.monitor
       Latenza: 0 usec, configurata 0 usec

Le righe, che a noi interessano, sono:

Nome: alsa_output.pci-0000_00_14.2.analog-stereo

e

Monitor della sorgente: alsa_output.pci-0000_00_14.2.analog-stereo.monitor

Da notare che:
1) la parte del nome "alsa_output", fa sì che saranno registrati i dati provenienti dall'uscita sonora della scheda audio;

2) la parte "pci-0000_00_14.2" della stringa di informazioni, ottenute e riportate sopra a titolo esemplificativo, può essere recuperata anche leggendo il seguente file di sistema: "/dev/snd/by-path".
In particolare utilizzeremo il nome del Monitor della sorgente audio di ALSA riportato dalla seconda riga, ossia:

 FONT COLOR=darkgreen>alsa_output.pci-0000_00_14.2.analog-stereo</font>

Mostriamo un esempio pratico a "riga di comando", con il quale si otterrà un file audio finale del formato MP3:

Private Const QUALITY As String = "quality"
Private Const BITRATE As String = "bitrate"
Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, lam, snk As MediaControl
 Dim temporaneo As String

 temporaneo = Temp

 pl = New MediaPipeline 
 
 src = New MediaControl(pl, "pulsesrc")   
 src["device"] = "alsa_output.pci-0000_00_14.2.analog-stereo.monitor"
 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"] = temporaneo

 src.LinkTo(lam)
 lam.LinkTo(snk)

 pl.Play()

 While Not bo
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Wend

 Copy temporaneo To "/tmp/audio.mp3"

 pl.Stop()
 pl.Close()
 Print "\nTermine registrazione"
 Quit

End

Public Sub Application_Read()  ' Questo Evento viene sollevato, cliccando sul tasto "Invio" della tastiera
 
bo = True
 
End

In quest'altro esempio, analogo al precedente, si otterrà un file audio di formato OGG:

Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, aco, ven, omu, snk As MediaControl
 Dim temporaneo As String

 temporaneo = Temp

 pl = New MediaPipeline 
 
 src = New MediaControl(pl, "pulsesrc")   
 src["device"] = "alsa_output.pci-0000_00_14.2.analog-stereo.monitor"
 aco = New MediaControl(pl, "audioconvert")
 ven = New MediaControl(pl, "vorbisenc")
 omu = New MediaControl(pl, "oggmux")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = temporaneo

 src.LinkTo(aco)
 aco.LinkTo(ven)
 ven.LinkTo(omu)
 omu.LinkTo(snk)

 pl.Play()

 While Not bo
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Wend

 Copy temporaneo To "/tmp/audio.ogg"

 pl.Stop()
 pl.Close()
 Print "\nTermine registrazione"
 Quit

End

Public Sub Application_Read()  ' Questo Evento viene sollevato, cliccando sul tasto "Invio" della tastiera
 
bo = True
 
End

Registrare i dati in "Entrata" della scheda audio

Se si intende, invece, registrare i dati sonori in Entrata della sched audio, riprendendo le righe esemplificative restituite dal comando "actl list sinks", si prenderà in considerazione la riga:

Nome: alsa_output.pci-0000_00_14.2.analog-stereo

sotituenda la parola "output" con "input", ottenendo quindi:

alsa_input.pci-0000_00_14.2.analog-stereo


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 temporaneo As String
 
 temporaneo = 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"] = temporaneo
  
 src.LinkTo(aco)
 aco.LinkTo(flt)
 flt.LinkTo(wen)
 wen.LinkTo(snk)
  
 pl.Play()
  
 While Not bo
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Wend
  
 Copy temporaneo To "/tmp/audio.wav"
  
 pl.Stop()
 pl.Close()
 Print "Termine registrazione"
 Quit
  
End


Public Sub Application_Read()

 bo = True

End