Differenze tra le versioni di "Registrare il sonoro da una fonte esterna e salvarlo in un file audio mediante il Componente gb.media"
Riga 15: | Riga 15: | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim src, aco, wen, snk As MediaControl | Dim src, aco, wen, snk As MediaControl | ||
− | Dim | + | Dim temporaneo As String |
− | + | temporaneo = Temp | |
pl = New MediaPipeline | pl = New MediaPipeline | ||
Riga 25: | Riga 25: | ||
wen = New MediaControl(pl, "wavenc") | wen = New MediaControl(pl, "wavenc") | ||
snk = New MediaControl(pl, "filesink") | snk = New MediaControl(pl, "filesink") | ||
− | snk["location"] = | + | snk["location"] = temporaneo |
src.LinkTo(aco) | src.LinkTo(aco) | ||
Riga 33: | Riga 33: | ||
pl.Play() | pl.Play() | ||
− | + | While Not bo | |
Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
Wait 0.01 | Wait 0.01 | ||
− | + | Wend | |
− | Copy | + | Copy temporaneo To "/tmp/audio.wav" |
pl.Stop() | pl.Stop() | ||
Riga 63: | Riga 63: | ||
Dim src, aco, wen, snk As MediaControl | Dim src, aco, wen, snk As MediaControl | ||
Dim flt As MediaFilter | Dim flt As MediaFilter | ||
− | Dim | + | Dim temporaneo As String |
− | + | temporaneo = Temp | |
pl = New MediaPipeline | pl = New MediaPipeline | ||
Riga 74: | Riga 74: | ||
wen = New MediaControl(pl, "wavenc") | wen = New MediaControl(pl, "wavenc") | ||
snk = New MediaControl(pl, "filesink") | snk = New MediaControl(pl, "filesink") | ||
− | snk["location"] = | + | snk["location"] = temporaneo |
src.LinkTo(aco) | src.LinkTo(aco) | ||
Riga 83: | Riga 83: | ||
pl.Play() | pl.Play() | ||
− | + | While Not bo | |
Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
Wait 0.01 | Wait 0.01 | ||
− | + | Wend | |
− | Copy | + | Copy temporaneo To "/tmp/audio.wav" |
pl.Stop() | pl.Stop() | ||
Riga 114: | Riga 114: | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim src, aco, lam, snk As MediaControl | Dim src, aco, lam, snk As MediaControl | ||
− | Dim | + | Dim temporaneo As String |
− | + | temporaneo = Temp | |
pl = New MediaPipeline | pl = New MediaPipeline | ||
Riga 127: | Riga 127: | ||
lam["bitrate"] = 192 <FONT Color=gray>' ''Imposta il valore del Bitrate "Costante".''</font> | lam["bitrate"] = 192 <FONT Color=gray>' ''Imposta il valore del Bitrate "Costante".''</font> | ||
snk = New MediaControl(pl, "filesink") | snk = New MediaControl(pl, "filesink") | ||
− | snk["location"] = | + | snk["location"] = temporaneo |
src.LinkTo(aco) | src.LinkTo(aco) | ||
Riga 135: | Riga 135: | ||
pl.Play() | pl.Play() | ||
− | + | While Not bo | |
Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
Wait 0.01 | Wait 0.01 | ||
− | + | Wend | |
− | Copy | + | Copy temporaneo To "/tmp/audio.mp3" |
pl.Stop() | pl.Stop() | ||
Riga 164: | Riga 164: | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim src, aco, ven, omu, snk As MediaControl | Dim src, aco, ven, omu, snk As MediaControl | ||
− | Dim | + | Dim temporaneo As String |
− | + | temporaneo = Temp | |
pl = New MediaPipeline | pl = New MediaPipeline | ||
Riga 175: | Riga 175: | ||
omu = New MediaControl(pl, "oggmux") | omu = New MediaControl(pl, "oggmux") | ||
snk = New MediaControl(pl, "filesink") | snk = New MediaControl(pl, "filesink") | ||
− | snk["location"] = | + | snk["location"] = temporaneo |
src.LinkTo(aco) | src.LinkTo(aco) | ||
Riga 184: | Riga 184: | ||
pl.Play() | pl.Play() | ||
− | + | While Not bo | |
Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
Wait 0.01 | Wait 0.01 | ||
− | + | Wend | |
− | Copy | + | Copy temporaneo To "/tmp/audio.ogg" |
pl.Stop() | pl.Stop() | ||
Riga 218: | Riga 218: | ||
Dim dur, bs, dur_eff, i As Integer | Dim dur, bs, dur_eff, i As Integer | ||
Dim canali, bit As Byte | Dim canali, bit As Byte | ||
− | Dim | + | Dim temporaneo, mss As String |
− | + | temporaneo = 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> | ||
Riga 236: | Riga 236: | ||
enc = New MediaControl(pl, "wavenc") | enc = New MediaControl(pl, "wavenc") | ||
snk = New MediaControl(pl, "filesink") | snk = New MediaControl(pl, "filesink") | ||
− | snk["location"] = | + | snk["location"] = temporaneo |
<FONT Color=gray>' ''Colleghiamo fra loro gli Elementi di "GStreamer":''</font> | <FONT Color=gray>' ''Colleghiamo fra loro gli Elementi di "GStreamer":''</font> | ||
Riga 251: | Riga 251: | ||
If i < (dur_eff * 1000) Then | If i < (dur_eff * 1000) Then | ||
mss = "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | mss = "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
+ | Wait 0.01 | ||
Else | Else | ||
pl.Stop() | pl.Stop() | ||
Riga 305: | Riga 306: | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim src, lam, snk As MediaControl | Dim src, lam, snk As MediaControl | ||
− | Dim | + | Dim temporaneo As String |
− | + | temporaneo = Temp | |
pl = New MediaPipeline | pl = New MediaPipeline | ||
Riga 318: | Riga 319: | ||
lam["bitrate"] = 192 <FONT Color=gray>' ''Imposta il valore del Bitrate "Costante".''</font> | lam["bitrate"] = 192 <FONT Color=gray>' ''Imposta il valore del Bitrate "Costante".''</font> | ||
snk = New MediaControl(pl, "filesink") | snk = New MediaControl(pl, "filesink") | ||
− | snk["location"] = | + | snk["location"] = temporaneo |
src.LinkTo(lam) | src.LinkTo(lam) | ||
Riga 325: | Riga 326: | ||
pl.Play() | pl.Play() | ||
− | + | While Not bo | |
Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
Wait 0.01 | Wait 0.01 | ||
− | + | Wend | |
− | Copy | + | Copy temporaneo To "/tmp/audio.mp3" |
pl.Stop() | pl.Stop() | ||
Riga 352: | Riga 353: | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim src, aco, ven, omu, snk As MediaControl | Dim src, aco, ven, omu, snk As MediaControl | ||
− | Dim | + | Dim temporaneo As String |
− | + | temporaneo = Temp | |
pl = New MediaPipeline | pl = New MediaPipeline | ||
Riga 364: | Riga 365: | ||
omu = New MediaControl(pl, "oggmux") | omu = New MediaControl(pl, "oggmux") | ||
snk = New MediaControl(pl, "filesink") | snk = New MediaControl(pl, "filesink") | ||
− | snk["location"] = | + | snk["location"] = temporaneo |
src.LinkTo(aco) | src.LinkTo(aco) | ||
Riga 373: | Riga 374: | ||
pl.Play() | pl.Play() | ||
− | + | While Not bo | |
Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
Wait 0.01 | Wait 0.01 | ||
− | + | Wend | |
− | Copy | + | Copy temporaneo To "/tmp/audio.ogg" |
pl.Stop() | pl.Stop() | ||
Riga 414: | Riga 415: | ||
Dim src, aco, wen, snk As MediaControl | Dim src, aco, wen, snk As MediaControl | ||
Dim flt As MediaFilter | Dim flt As MediaFilter | ||
− | Dim | + | Dim temporaneo As String |
− | + | temporaneo = Temp | |
pl = New MediaPipeline | pl = New MediaPipeline | ||
Riga 427: | Riga 428: | ||
wen = New MediaControl(pl, "wavenc") | wen = New MediaControl(pl, "wavenc") | ||
snk = New MediaControl(pl, "filesink") | snk = New MediaControl(pl, "filesink") | ||
− | snk["location"] = | + | snk["location"] = temporaneo |
src.LinkTo(aco) | src.LinkTo(aco) | ||
Riga 436: | Riga 437: | ||
pl.Play() | pl.Play() | ||
− | + | While Not bo | |
Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
Wait 0.01 | Wait 0.01 | ||
− | + | Wend | |
− | Copy | + | Copy temporaneo To "/tmp/audio.wav" |
pl.Stop() | pl.Stop() |
Versione delle 14:44, 16 mag 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 ".
Indice
- 1 Usare il plugin "alsasrc" di GStreamer per leggere i dati dalla scheda audio
- 1.1 Salvare la registrazione in un file audio WAV (44100 hertz, mono, 16-bit)
- 1.2 Salvare la registrazione in un file audio WAV (44100 hertz, stereo, 16-bit)
- 1.3 Salvare la registrazione in un file audio MP3
- 1.4 Salvare la registrazione in un file audio OGG
- 1.5 Impostare preliminarmente la durata della registrazione audio
- 2 Usare il plugin "pulsesrc" di GStreamer per leggere i dati dalla scheda audio
- 3 Registrare utilizzando il plugin "jackaudiosink" di GStreamer
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 "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:
alsa_output.pci-0000_00_14.2.analog-stereo
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