Páginas (2): 1 2   
kokodrilo   09-11-2020, 14:09
#1
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
Última modificación: 09-11-2020, 22:33 por kokodrilo.

El tiempo de las manifestaciones caducó pero el boicot con auto sacrificio es el camino para derrotar al sistema.
vuott   09-11-2020, 18:16
#2
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
Última modificación: 09-11-2020, 18:19 por vuott.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
kokodrilo   09-11-2020, 20:12
#3
la idea es grabar la radio mientras se escucha

El tiempo de las manifestaciones caducó pero el boicot con auto sacrificio es el camino para derrotar al sistema.
vuott   09-11-2020, 21:49
#4
(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
Última modificación: 11-11-2020, 01:56 por vuott.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
kokodrilo   09-11-2020, 22:18
#5
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.
Última modificación: 09-11-2020, 22:25 por kokodrilo.

El tiempo de las manifestaciones caducó pero el boicot con auto sacrificio es el camino para derrotar al sistema.
vuott   09-11-2020, 23:18
#6
(09-11-2020, 22:18)kokodrilo escribió: y es código gambas

Cool

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
kokodrilo   10-11-2020, 07:42
#7
(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....
Última modificación: 10-11-2020, 08:23 por kokodrilo.

El tiempo de las manifestaciones caducó pero el boicot con auto sacrificio es el camino para derrotar al sistema.
vuott   10-11-2020, 17:08
#8
(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.
Última modificación: 10-11-2020, 17:30 por vuott.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
kokodrilo   10-11-2020, 19:09
#9
si voy a probar a ver si me doy maña, gracias

El tiempo de las manifestaciones caducó pero el boicot con auto sacrificio es el camino para derrotar al sistema.
vuott   11-11-2020, 01:52
#10
(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
Última modificación: 11-11-2020, 01:58 por vuott.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
Páginas (2): 1 2   
  
Usuarios navegando en este tema: 2 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.