Registrare il sonoro da una fonte esterna e salvarlo in un file audio mediante il Componente gb.media
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 Salvare la registrazione in un file audio WAV (44100 hertz, mono, 16-bit)
- 2 Salvare la registrazione in un file audio WAV (44100 hertz, stereo, 16-bit)
- 3 Salvare la registrazione in un file audio MP3
- 4 Salvare la registrazione in un file audio OGG
- 5 Impostare preliminarmente la durata della regisrazione audio
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 = "/tmp/primofile.wav" bo = True 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() While bo 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() Print "Termine registrazione" Quit End Public Sub Application_Read() Dim s As String Input s bo = False 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 = "/tmp/primofile.wav" bo = True 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() While bo 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() Print "Termine registrazione" Quit End Public Sub Application_Read() Dim s As String Input s bo = False End
Salvare la registrazione in un file audio MP3
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, aco, len, snk As MediaControl Dim primofile As String primofile = "/tmp/primofile.mp3" bo = True pl = New MediaPipeline src = New MediaControl(pl, "alsasrc") aco = New MediaControl(pl, "audioconvert") len = New MediaControl(pl, "lamemp3enc") snk = New MediaControl(pl, "filesink") snk["location"] = primofile src.LinkTo(aco) aco.LinkTo(len) len.LinkTo(snk) pl.Play() While bo Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) Wait 0.001 Wend Copy primofile To "/tmp/audio.mp3" pl.Stop() pl.Close() Print "Termine registrazione" Quit End Public Sub Application_Read() Dim s As String Input s bo = False 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 = "/tmp/primofile.ogg" bo = True 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() While bo Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) Wait 0.001 Wend Copy primofile To "/tmp/audio.ogg" pl.Stop() pl.Close() Print "Termine registrazione" Quit End Public Sub Application_Read() Dim s As String Input s bo = False 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 = "/tmp/primofile" ' 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 #File.Out, mss Loop End