Comunidad Gambas-es

Versión completa: ¿como capturar el audio de nuestra pc en Gambas?
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
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
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.
GAMBAS
  1. Private pl As MediaPipeline
  2.  
  3.  
  4. Public Sub ToggleButton1_Click()
  5.  
  6.   Dim src, cnv, ven, omu, snk As MediaControl
  7.   Dim tm As Date
  8.  
  9.   If ToggleButton1.Value Then
  10.     pl = New MediaPipeline
  11.     
  12.     src = New MediaControl(pl, "uridecodebin")
  13.     src["uri"] = "http://dirección/web/flujo/radio"    ' Dirección del flujo web radio
  14.     cnv = New MediaControl(pl, "audioconvert")
  15.     ven = New MediaControl(pl, "vorbisenc")
  16.     omu = New MediaControl(pl, "oggmux")
  17.     snk = New MediaControl(pl, "filesink")
  18.     snk["location"] = "/tmp/audio.ogg"          ' Carpeta donde será guardado el archivo audio OGG
  19.  
  20.     src.LinkLaterTo(cnv)
  21.     cnv.LinkTo(ven)
  22.     ven.LinkTo(omu)
  23.     omu.LinkTo(snk)
  24.  
  25.     pl.Play()
  26.     
  27.     Repeat        ' Bucle para esperar a que la reproducción de audio se active
  28.       Wait 0.01
  29.     Until pl.State == Media.Playing
  30.  
  31.     tm = Now
  32.  
  33.     Repeat
  34.       Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss")
  35.       Wait 0.01
  36.     Until pl.State == Media.Ready
  37.   Else
  38.     pl.Stop
  39.     pl.Close
  40.  


la idea es grabar la radio mientras se escucha
(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:
GAMBAS
  1. Private pl As MediaPipeline
  2.  
  3.  
  4. Public Sub ToggleButton1_Click()
  5.  
  6.   Dim src, tee, que As MediaControl
  7.   Dim cnv1, snk1 As MediaControl
  8.   Dim cnv2, ven, omu, snk2 As MediaControl
  9.   Dim tm As Date
  10.  
  11.   If ToggleButton1.Value Then
  12.     pl = New MediaPipeline
  13.     
  14.     src = New MediaControl(pl, "uridecodebin")
  15.     src["uri"] = "http://dirección/web/flujo/radio"             ' Dirección del flujo web radio
  16.  
  17.     tee = New MediaControl(pl, "tee")
  18.     que = New MediaControl(pl, "queue")
  19.  
  20. ' Para escuchar el flujo radio web:
  21.     cnv1 = New MediaControl(pl, "audioconvert")
  22.     snk1 = New MediaControl(pl, "autoaudiosink")
  23.  
  24. ' Para guardar el flujo radio web en formato OGG:
  25.     cnv2 = New MediaControl(pl, "audioconvert")
  26.     ven = New MediaControl(pl, "vorbisenc")
  27.     omu = New MediaControl(pl, "oggmux")
  28.     snk2 = New MediaControl(pl, "filesink")
  29.     snk2["location"] = "/tmp/audio.ogg"             ' Carpeta donde será guardado el archivo audio OGG
  30.  
  31. ' Divide el flujo de datos audio en dos ramas:
  32.     src.LinkLaterTo(tee)
  33.  
  34. ' 1^ rama de datos audio (para escuchar):
  35.     tee.LinkTo(que)
  36.     que.LinkTo(cnv1)
  37.     cnv1.LinkTo(snk1)
  38.  
  39. ' 2^ rama de datos audio (para guardar):
  40.     tee.LinkTo(cnv2)
  41.     cnv2.LinkTo(ven)
  42.     ven.LinkTo(omu)
  43.     omu.LinkTo(snk2)
  44.     
  45.     pl.Play()
  46.     
  47.     Repeat
  48.       Wait 0.01
  49.     Until pl.State == Media.Playing
  50.  
  51.     tm = Now
  52.  
  53.     Repeat
  54.       Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss")
  55.       Wait 0.01
  56.     Until pl.State == Media.Ready
  57.   Else
  58.     pl.Stop
  59.     pl.Close
  60.  
  61.  
  62.  
  63. Public Sub Form_Close()
  64.  
  65.   ToggleButton1.Value = False
  66.  
  67. ' Ya que, al cerrar el Form, los datos guardados en el archivo inexplicablemente se pierden,
  68. ' tenemos que copiar el archivo de audio en un otro nuevo archivo similar:
  69.  
  70.   Copy "/tmp/audio.ogg" To "/tmp/audiofinal.ogg"
  71.  


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.
(09-11-2020, 22:18)kokodrilo escribió: [ -> ]y es código gambas

Cool
(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....
(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.
si voy a probar a ver si me doy maña, gracias
(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.

GAMBAS
  1. Private pl As MediaPipeline
  2. Private tee As MediaControl
  3. Private cnv2 As MediaControl
  4. Private ven As MediaControl
  5. Private omu As MediaControl
  6. Private snk2 As MediaControl
  7.  
  8.  
  9. Public Sub Form_Open()
  10.  
  11.   ToggleButton1.Text = "Escucha radio"
  12.   Button1.Enabled = False
  13.   Button2.Enabled = False
  14.  
  15.  
  16.  
  17. Public Sub ToggleButton1_Click()
  18.  
  19.   If ToggleButton1.Value Then
  20.     ToggleButton1.Text = "Cerrar el programa"
  21.     Button1.Enabled = True
  22.     Button1.Text = "Guardar audio"
  23.     Button2.Enabled = True
  24.     Button2.Text = "Stop grabacion"
  25.     Audio()
  26.   Else
  27.     pl.Stop
  28.     pl.Close
  29.     Me.Close
  30.  
  31.  
  32.  
  33. Public Sub Button1_Click()
  34.  
  35.   Audio()
  36.  
  37.  
  38.  
  39.   Dim src, que As MediaControl
  40.   Dim cnv1, snk1 As MediaControl
  41.   Dim tm As Date
  42.  
  43.   pl = New MediaPipeline
  44.  
  45.   src = New MediaControl(pl, "uridecodebin")
  46.   src["uri"] = "http://radiogalileo.it:8000/RadioStranamore"
  47.      
  48.   tee = New MediaControl(pl, "tee")
  49.   que = New MediaControl(pl, "queue")
  50.      
  51. ' Para escuchar el flujo radio web:
  52.   cnv1 = New MediaControl(pl, "audioconvert")
  53.   snk1 = New MediaControl(pl, "autoaudiosink")
  54.      
  55. ' Para guardar el flujo radio web en formato OGG:
  56.   cnv2 = New MediaControl(pl, "audioconvert")
  57.   ven = New MediaControl(pl, "vorbisenc")
  58.   omu = New MediaControl(pl, "oggmux")
  59.      
  60. ' Divide el flujo de datos audio en dos ramas:
  61.   src.LinkLaterTo(tee)
  62.      
  63. ' 1^ rama de datos audio (para escuchar):
  64.   tee.LinkTo(que)
  65.   que.LinkTo(cnv1)
  66.   cnv1.LinkTo(snk1)
  67.      
  68. ' 2^ rama de datos audio (para guardar):
  69.   tee.LinkTo(cnv2)
  70.   cnv2.LinkTo(ven)
  71.   ven.LinkTo(omu)
  72.   snk2 = New MediaControl(pl, "filesink")
  73.   Inc i
  74.   snk2["location"] = "/tmp/audio" & CStr(i) & ".ogg"
  75.   omu.LinkTo(snk2)
  76.   If Exist("/tmp/audio0.ogg") Then Kill "/tmp/audio0.ogg"
  77.       
  78.   pl.Play()
  79.         
  80.   Button2.Enabled = True
  81.         
  82.     Wait 0.01
  83.   Until pl.State == Media.Playing
  84.      
  85.   tm = Now
  86.      
  87.     Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss")
  88.     Wait 0.01
  89.   Until pl.State == Media.Ready
  90.      
  91.  
  92.  
  93. Public Sub Button2_Click()
  94.  
  95.   Move "/tmp/audio" & CStr(i) & ".ogg" To "/tmp/audiofinal" & CStr(i) & ".ogg"    ' Cual es y donde está el archivo audio guardado
  96.   Button1.Enabled = True
  97.   Button2.Enabled = False
  98.  


Páginas: 1 2