Comunidad Gambas-es
[SOLUCIONADO] ¿como capturar el audio de nuestra pc en Gambas? - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: [SOLUCIONADO] ¿como capturar el audio de nuestra pc en Gambas? (/thread-183.html)

Páginas: 1 2


¿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

Cool


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 Confused 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