¿como capturar el audio de nuestra pc en Gambas? - kokodrilo - 09-11-2020
buenas,
Pues lo del titulo, estoy trabajando en un programita para escuchar radios, para VisorRV1960, y veo que seria útil poder grabar esa radio en algún momento especifico. La cuestión es que no tengo idea de por donde empezar. Alguien sabe como encarar esta dificultad de programación?
Nota: en lo posible no depender de otro programa.
bueno hasta ahora solo encuentro con programas externos
ffmpeg
esto es lo más fácil que he encontrado hasta ahora: arecord grabacion100.mp3
RE: ¿como capturar el audio de nuestra pc en Gambas? - vuott - 09-11-2020
Una manera bastante fácil es usando el Componente gb.media.
Vamos a ver un simplex exemplum en entorno grafico. El flujo audio de la radio web será guardado en un archivo audio OGG.
En este codigo no es posible escuchar simultáneamente el audio.
Código: Private pl As MediaPipeline
Public Sub ToggleButton1_Click()
Dim src, cnv, ven, omu, snk As MediaControl
Dim tm As Date
If ToggleButton1.Value Then
pl = New MediaPipeline
src = New MediaControl(pl, "uridecodebin")
src["uri"] = "http://dirección/web/flujo/radio" ' Dirección del flujo web radio
cnv = New MediaControl(pl, "audioconvert")
ven = New MediaControl(pl, "vorbisenc")
omu = New MediaControl(pl, "oggmux")
snk = New MediaControl(pl, "filesink")
snk["location"] = "/tmp/audio.ogg" ' Carpeta donde será guardado el archivo audio OGG
src.LinkLaterTo(cnv)
cnv.LinkTo(ven)
ven.LinkTo(omu)
omu.LinkTo(snk)
pl.Play()
Repeat ' Bucle para esperar a que la reproducción de audio se active
Wait 0.01
Until pl.State == Media.Playing
tm = Now
Repeat
Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss")
Wait 0.01
Until pl.State == Media.Ready
Else
pl.Stop
pl.Close
Endif
End
RE: ¿como capturar el audio de nuestra pc en Gambas? - kokodrilo - 09-11-2020
la idea es grabar la radio mientras se escucha
RE: ¿como capturar el audio de nuestra pc en Gambas? - vuott - 09-11-2020
(09-11-2020, 20:12)kokodrilo escribió: grabar la radio mientras se escucha
Por supuesto.
Bueno, en el mi ejemplo usé las Clases "MediaPipeline" y "MediaControl" del Componente gb.media., que se basa en los recursos del sistema multimedia Gstreamer.
En el sistema multimedia Gstreamer una "Pipeline" es una secuencia de elementos conectados, y constituye la estructura en la que se basa Gstreamer para procesar un flujo multimedia.
"Escuchar" y "guardar" los datos audio son dos acciones diferentes. Por eso tenemos que dividir el flujo de datos audio, esencialmente duplicarlo.
Para ello, hace falta utilizar el plugin "tee" de Gstreamer.
Vamos a veer un ejemplo:
Código: Private pl As MediaPipeline
Public Sub ToggleButton1_Click()
Dim src, tee, que As MediaControl
Dim cnv1, snk1 As MediaControl
Dim cnv2, ven, omu, snk2 As MediaControl
Dim tm As Date
If ToggleButton1.Value Then
pl = New MediaPipeline
src = New MediaControl(pl, "uridecodebin")
src["uri"] = "http://dirección/web/flujo/radio" ' Dirección del flujo web radio
tee = New MediaControl(pl, "tee")
que = New MediaControl(pl, "queue")
' Para escuchar el flujo radio web:
cnv1 = New MediaControl(pl, "audioconvert")
snk1 = New MediaControl(pl, "autoaudiosink")
' Para guardar el flujo radio web en formato OGG:
cnv2 = New MediaControl(pl, "audioconvert")
ven = New MediaControl(pl, "vorbisenc")
omu = New MediaControl(pl, "oggmux")
snk2 = New MediaControl(pl, "filesink")
snk2["location"] = "/tmp/audio.ogg" ' Carpeta donde será guardado el archivo audio OGG
' Divide el flujo de datos audio en dos ramas:
src.LinkLaterTo(tee)
' 1^ rama de datos audio (para escuchar):
tee.LinkTo(que)
que.LinkTo(cnv1)
cnv1.LinkTo(snk1)
' 2^ rama de datos audio (para guardar):
tee.LinkTo(cnv2)
cnv2.LinkTo(ven)
ven.LinkTo(omu)
omu.LinkTo(snk2)
pl.Play()
Repeat
Wait 0.01
Until pl.State == Media.Playing
tm = Now
Repeat
Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss")
Wait 0.01
Until pl.State == Media.Ready
Else
pl.Stop
pl.Close
Endif
End
Public Sub Form_Close()
ToggleButton1.Value = False
' Ya que, al cerrar el Form, los datos guardados en el archivo inexplicablemente se pierden,
' tenemos que copiar el archivo de audio en un otro nuevo archivo similar:
Copy "/tmp/audio.ogg" To "/tmp/audiofinal.ogg"
End
RE: ¿como capturar el audio de nuestra pc en Gambas? - kokodrilo - 09-11-2020
gracias vuott voy a experimentar con ese código, es una área de programación que desconozco totalmente.
anda perfecto y es código gambas.
RE: ¿como capturar el audio de nuestra pc en Gambas? - vuott - 09-11-2020
(09-11-2020, 22:18)kokodrilo escribió: y es código gambas
RE: ¿como capturar el audio de nuestra pc en Gambas? - kokodrilo - 10-11-2020
(09-11-2020, 21:49)vuott escribió: ToggleButton1_Value = False
ToggleButton1.Value = False
necesitaría los procesos separados, es decir poder escuchar solamente, y en algún momento grabar, parar la grabación, grabar etc. Por lo que estoy viendo es muy complicado entender el funcionamiento de gstream. sigo leyendo....
RE: ¿como capturar el audio de nuestra pc en Gambas? - vuott - 10-11-2020
(10-11-2020, 07:42)kokodrilo escribió: ToggleButton1.Value = False
Sì, gracias.
Fue un error de mi distracción.
(10-11-2020, 07:42)kokodrilo escribió: poder escuchar solamente, y en algún momento grabar
Quizás puedes crear y usar dos Pipeline diferentes.
RE: ¿como capturar el audio de nuestra pc en Gambas? - kokodrilo - 10-11-2020
si voy a probar a ver si me doy maña, gracias
RE: ¿como capturar el audio de nuestra pc en Gambas? - vuott - 11-11-2020
(10-11-2020, 17:08)vuott escribió: crear y usar dos Pipeline diferentes
Uhmmmm... quizás nosotros podemos solucionar de manera diferente con una sola Pipeline.
Código: Private pl As MediaPipeline
Private tee As MediaControl
Private cnv2 As MediaControl
Private ven As MediaControl
Private omu As MediaControl
Private snk2 As MediaControl
Private i As Integer = -1
Public Sub Form_Open()
ToggleButton1.Text = "Escucha radio"
Button1.Enabled = False
Button2.Enabled = False
End
Public Sub ToggleButton1_Click()
If ToggleButton1.Value Then
ToggleButton1.Text = "Cerrar el programa"
Button1.Enabled = True
Button1.Text = "Guardar audio"
Button2.Enabled = True
Button2.Text = "Stop grabacion"
Audio()
Else
pl.Stop
pl.Close
Me.Close
Endif
End
Public Sub Button1_Click()
Audio()
End
Private Procedure Audio()
Dim src, que As MediaControl
Dim cnv1, snk1 As MediaControl
Dim tm As Date
pl = New MediaPipeline
src = New MediaControl(pl, "uridecodebin")
src["uri"] = "http://radiogalileo.it:8000/RadioStranamore"
tee = New MediaControl(pl, "tee")
que = New MediaControl(pl, "queue")
' Para escuchar el flujo radio web:
cnv1 = New MediaControl(pl, "audioconvert")
snk1 = New MediaControl(pl, "autoaudiosink")
' Para guardar el flujo radio web en formato OGG:
cnv2 = New MediaControl(pl, "audioconvert")
ven = New MediaControl(pl, "vorbisenc")
omu = New MediaControl(pl, "oggmux")
' Divide el flujo de datos audio en dos ramas:
src.LinkLaterTo(tee)
' 1^ rama de datos audio (para escuchar):
tee.LinkTo(que)
que.LinkTo(cnv1)
cnv1.LinkTo(snk1)
' 2^ rama de datos audio (para guardar):
tee.LinkTo(cnv2)
cnv2.LinkTo(ven)
ven.LinkTo(omu)
snk2 = New MediaControl(pl, "filesink")
Inc i
snk2["location"] = "/tmp/audio" & CStr(i) & ".ogg"
omu.LinkTo(snk2)
If Exist("/tmp/audio0.ogg") Then Kill "/tmp/audio0.ogg"
pl.Play()
Button2.Enabled = True
Repeat
Wait 0.01
Until pl.State == Media.Playing
tm = Now
Repeat
Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss")
Wait 0.01
Until pl.State == Media.Ready
End
Public Sub Button2_Click()
Move "/tmp/audio" & CStr(i) & ".ogg" To "/tmp/audiofinal" & CStr(i) & ".ogg" ' Cual es y donde está el archivo audio guardado
Button1.Enabled = True
Button2.Enabled = False
End
|