Registrare il sonoro da una fonte esterna e salvarlo in un file audio mediante il Componente gb.media: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 14: | Riga 14: | ||
Dim primofile As String | 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''' | '''End''' | ||
'''Public''' Sub Application_Read() | '''Public''' Sub Application_Read() | ||
bo = True | |||
'''End''' | '''End''' | ||
| Riga 64: | Riga 62: | ||
Dim primofile As String | 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''' | '''End''' | ||
'''Public''' Sub Application_Read() | '''Public''' Sub Application_Read() | ||
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 = 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''' | '''End''' | ||
'''Public''' Sub Application_Read() | '''Public''' Sub Application_Read() | ||
bo = True | |||
'''End''' | '''End''' | ||
| Riga 222: | Riga 216: | ||
Dim primofile, mss As String | Dim primofile, mss As String | ||
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 | |||
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 | |||
<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) | |||
enc.LinkTo(snk) | |||
<FONT Color=gray>' ''Avvia la registrazione audio:''</font> | <FONT Color=gray>' ''Avvia la registrazione audio:''</font> | ||
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''' | '''End''' | ||
| Riga 282: | Riga 276: | ||
Dim primofile As String | Dim primofile As String | ||
primofile = Temp | |||
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.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''' | '''End''' | ||
'''Public''' Sub Application_Read() | '''Public''' Sub Application_Read() | ||
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