Gambas-it

Gambas3 => Programmazione => Topic aperto da: allegfede - 27 Gennaio 2017, 14:03:06

Titolo: usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 27 Gennaio 2017, 14:03:06
Il seguente esempio (post numero 10 http://www.gambas-it.org/smf/index.php?topic=5414.msg40479#msg40479 (http://www.gambas-it.org/smf/index.php?topic=5414.msg40479#msg40479)) e' ora COMPLETO e FUNZIONANTE
Citazione
Premettiamo che il seguente esempio e' attualemente INCOMPLETO, poiche' il file audio viene APERTO, ma non riprodotto.

Specifichiamo che l'interfacciamento tra' il programma in GAMBAS e il server audio JACK e' ottenuto ESCLUSIVAMENTE con risorse interne a GAMBAS, ovvero il componente GB.MEDIA

in pratica mi e' passata per la mente l'idea che potesse esserci un "plug in" di gstreamer che potese interfacciarsi con JACK AUDIO e cercando su google e' venuto fuori che  "jackaudiosink" potrebbe essere cio' che ci necessita ().

testando il nostro server audio jack (che deve essere in esecuzione. Vi consiglio l'ottimo QJACKCTL) con questa riga da terminale:
Codice: [Seleziona]
 gst-launch audiotestsrc ! jackaudiosink
possiamo vedere nelle connessioni che viene creato un "CAVO" tra' la sorgente (il programma  gst-launch) e la destinazione (di default il primo canale audio d'uscita disponibile della vostra scheda audio).

quindi parafrasando i vari esempi presenti sul wiki di gambas italia relativi alal gestione del VIDEO, ho cambiato un po' le cose:
Codice: [Seleziona]
' Gambas class file

Private Player_A As MediaPlayer   'player che gestira' i media con gb.media (gstreamer)
Private UscitaAudio As MediaControl 'l'ambito di rendering dei media

Public Sub Button1_Click()

  Dialog.Filter = ["*.mp3", "file audio mp3", "*", "All files"]

  If Dialog.OpenFile() Then
    Return ' User pressed Cancel -
    Else
      Label1.Text = Dialog.Path
      Button2.Enabled = True
  Endif

End

Public Sub Button2_Click()
  Try Player_A.Close

  Player_A = New MediaPlayer As "MediaPlayer"
  'se vuoi riprodurre il media nell'ambiente VERO usa questo
  UscitaAudio = New MediaControl(Player_A, "jackaudiosink")
 
  Button2.Enabled = False
  Button3.Enabled = True

End

Public Sub Button3_Click()

  Player_A.URL = Media.URL(Label1.Text)
  Player_A.Play
 
  Button4.Enabled = True
  Button5.Enabled = False
 
  Timer1.Start
 
End

Public Sub Timer1_Timer()

  ProgressBar1.Value = Player_A.Position / Player_A.Duration

End

Public Sub Button4_Click()
  Timer1.Stop

  Try Player_A.Stop
  Button5.Enabled = True

End

Public Sub Button5_Click()

  Try Player_A.Close
 
  Button2.Enabled = True
  Button3.Enabled = False
  Button4.Enabled = False
  Button5.Enabled = False

End

in allegato il progetto d'esempio.

PS: perche' il file non vada in play ancora non lo so'. Ipotizzo che non sia stato creato "in automatico" il client di jack. Quindi dovro' scoprire come rendere "edotto" il server audio jack della nostra esistenza. Stay tuned


https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-plugin-jack.html
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 27 Gennaio 2017, 14:43:17
Mi dà un errore alla riga e per i motivi visibili nel file immagine qui allegato.
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 27 Gennaio 2017, 15:14:40
hai copiaincollato o preso l'allegato?

hai cliccato su browse per selezionare un file audio?

:D
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 27 Gennaio 2017, 15:55:35
hai copiaincollato o preso l'allegato?
Scaricato l'allegato.



hai cliccato su browse per selezionare un file audio?
No, il file audio me l'ha portato la cicogna !      >:(
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 27 Gennaio 2017, 16:12:50
Dunque... ho constatato che il problema sorge tenendo attiva questa riga:
Codice: [Seleziona]
UscitaAudio = New MediaControl(Player_A, "jackaudiosink")

Se infatti la disattivo, il file audio viene eseguito regolarmente.

....non capisco, del resto, l'utilità della variabile "UscitaAudio", dato che non viene utilizzata da alcuna funzione.   :-\
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 27 Gennaio 2017, 16:19:19
Se attivo quella riga del codice, e se avvio preliminarmente QjackCTL, il problema non viene sollevato, ma ottengo un nuovo errore di "Division by zero" a questa riga:
Codice: [Seleziona]
ProgressBar1.Value = Player_A.Position / Player_A.Duration

Se disattivo questa riga, non viene sollevato alcun errore, ma il file audio non viene eseguito, o comunque (forse pur partendo) non si sente niente.


Suppongo, però, che non parta, perché, ponendo questa riga di verifica nella routine del Timer:
Codice: [Seleziona]
Public Sub Timer1_Timer()

   Print Player_A.Duration

End
la durata del file audio risulta essere sempre zero.

Ad ogni modo ho constatato che, come sempre mi accade, è l'avvio di Jack che mi impedisce l'esecuzione dei flussi audio in genere (tranne il Midi con Alsa).

Sarebbe opportuno che anche altri testassero il tuo programma.
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 27 Gennaio 2017, 17:29:05
Vi consiglio l'ottimo QJACKCTL) con questa riga da terminale:
Codice: [Seleziona]
 gst-launch audiotestsrc ! jackaudiosink
possiamo vedere nelle connessioni che viene creato un "CAVO" tra' la sorgente (il programma  gst-launch) e la destinazione (di default il primo canale audio d'uscita disponibile della vostra scheda audio).

Se vuoi testare con Gambas quella riga, usando le funzioni esterne di GStreamer, eccoti qua il codice:  (http://forum.ubuntu-it.org/images/smilies/whistle.gif)

Codice: [Seleziona]
Library "libgstreamer-1.0"

Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
 
' gst_init (int *argc, char **argv[])
' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.
Private Extern gst_init(argc As Pointer, argv As Pointer)

' GstElement * gst_parse_launch (const gchar *pipeline_description, GError **error)
' Create a new pipeline based on command line syntax.
Private Extern gst_parse_launch(description As String, GError As Pointer) As Pointer

' GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)
' Sets the state of the element.
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer
 
' void gst_object_unref(gpointer object)
' Decrements the reference count on object.
Private Extern gst_object_unref(gobject As Pointer)


Public Sub Main()
 
 Dim audio As Pointer
     
  gst_init(0, 0)
 
  audio = gst_parse_launch("audiotestsrc volume=0.5 freq=440 wave=sine ! jackaudiosink", 0)
         
' Avviamo l'esecuzione dell'onda sinusoidale......:
  gst_element_set_state(audio, GST_STATE_PLAYING)
 
' ...per 10 secondi:
  Sleep 10
 
  gst_object_unref(audio)
         
End
Dovrà essere preliminarmente avviato il server Jack.

Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 27 Gennaio 2017, 17:41:13
....se poi proprio vuoi invocare le risorse di Gambas, in particolare quelle delle Classi MediaPipeline e MediaControl del Componente gb.media, puoi fare così:

Codice: [Seleziona]
Public Sub Main()

  Dim pl As MediaPipeline
  Dim src, snk As MediaControl

   pl = New MediaPipeline
   
   src = New MediaControl(pl, "audiotestsrc")
   src["volume"] = "0.5"
   src["freq"] = "440"
   src["wave"] = 0
   snk = New MediaControl(pl, "jackaudiosink")

   src.LinkTo(snk)
   
   pl.Play()

   Sleep 10

End



Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 27 Gennaio 2017, 18:38:07
Ad ogni modo se vuoi eseguire un file wav con il Componente gb.media, utilizzando il plugin jackaudiosink di GStreamer, ecco qua:

Codice: [Seleziona]
Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, prs, cnv, snk As MediaControl
 
   pl = New MediaPipeline
   
   src = New MediaControl(pl, "filesrc")
   src["location"] = "/percorso/del/file.wav"      '  "location" è una proprietà del plugin "filesrc"
   prs = New MediaControl(pl, "wavparse")
   cnv = New MediaControl(pl, "audioconvert")
   snk = New MediaControl(pl, "jackaudiosink")
   src.LinkTo(prs)
   prs.LinkTo(cnv)
   cnv.LinkTo(snk)
   
   pl.Play()

   Print "\nDurata: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000)
   Wait pl.Duration
   
End
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 27 Gennaio 2017, 20:44:15
risolto.

Ora funziona e va in play, mancava un pezzo.

Codice: [Seleziona]
Player_A = New MediaPlayer As "MediaPlayer"
  'se vuoi riprodurre il media nell'ambiente VERO usa questo
 
  UscitaAudio = New MediaControl(Player_A, "jackaudiosink")
 
  Player_A.Audio.Output = UscitaAudio

dovevo indicare a gstreamer che l'uscita audio era quella settata nel modo opportuno :D

in allegato la funzione (che a me funziona senza spirito santo ;p)
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 27 Gennaio 2017, 22:59:14
....non capisco, del resto, l'utilità della variabile "UscitaAudio", dato che non viene utilizzata da alcuna funzione.

Ora funziona e va in play, mancava un pezzo.

Codice: [Seleziona]
UscitaAudio = New MediaControl(Player_A, "jackaudiosink")
 
  Player_A.Audio.Output = UscitaAudio

dovevo indicare a gstreamer che l'uscita audio era quella settata nel modo opportuno

Ecco, ora sì !

Funziona.
Molto bene. Bravo.   :)
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 28 Gennaio 2017, 00:21:05
Ti comunico che la tua applicazione è in grado di eseguire, oltre ai file audio, anche i file Midi.


Sia lodato San Midi (https://it.wikipedia.org/wiki/Musical_Instrument_Digital_Interface) !

 sanmidi
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 13 Febbraio 2017, 19:11:40
secondo te VUOT per fare il play di uno streaming audio?

ho provato con:
Player_A.URL = Media.URL("http://vps222134.ovh.net:8000/low_latency")

che e' il puntamento allo stream mp3, ma il sistema non gradisce ....
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 13 Febbraio 2017, 21:04:57
secondo te VUOTT per fare il play di uno streaming audio?
...e se io fossi morto, o meglio...tornato indietro nel passato, come risolveresti ?
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 15 Febbraio 2017, 09:59:02
Nulla,  me inventerei un altro progetto :-)

No chiedevo a te perché  mi hai detto che avevi sperimentato con i midi e quindi magari avevi testato qualche altra metodologia :p
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 15 Febbraio 2017, 10:08:11
Ad ogni modo se vuoi eseguire un file wav con il Componente gb.media, utilizzando il plugin jackaudiosink di GStreamer, ecco qua:

Codice: [Seleziona]
Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, prs, cnv, snk As MediaControl
 
   pl = New MediaPipeline
   
   src = New MediaControl(pl, "filesrc")
   src["location"] = "/percorso/del/file.wav"      '  "location" è una proprietà del plugin "filesrc"
   prs = New MediaControl(pl, "wavparse")
   cnv = New MediaControl(pl, "audioconvert")
   snk = New MediaControl(pl, "jackaudiosink")
   src.LinkTo(prs)
   prs.LinkTo(cnv)
   cnv.LinkTo(snk)
   
   pl.Play()

   Print "\nDurata: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000)
   Wait pl.Duration
   
End

Forse agendo sulla definizione della sorgente?
Gstbasesrc sembrerebbe implementare oltre che filesrc anche metodi per sorgenti live.

tcpclientsrc sembra interessante
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 15 Febbraio 2017, 12:24:16
Ma perché non fai le prove invece di domandare a me ?    :hard:
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 15 Febbraio 2017, 13:12:35
perche' stavo al bagno e mi passava per la testa questa roba :D

ora sono al pc e provo :p
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 15 Febbraio 2017, 23:43:57
installando Playbin con (su debian like):
sudo apt-get install rygel-gst-renderer

da shell si da':
gst-launch-1.0 -v playbin uri=http://radiogalileo.it:8000/live

e suona ..... un interessante spunto
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 15 Febbraio 2017, 23:54:28
e suona
Sì, confermo.

Però se tu dessi uno sguardo alla nostra WIKI, vedresti che già l'avevo considerato:

http://www.gambas-it.org/wiki/index.php?title=Riproduzione_dell%27audio_di_radio_WEB_con_le_funzioni_esterne_del_API_di_GStreamer
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 16 Febbraio 2017, 00:06:49
....se vuoi utilizzare le sole risorse di Gambas, attiva il Componente gb.media e prova questo codice:   (http://forum.ubuntu-it.org/images/smilies/whistle.gif)

Codice: [Seleziona]
Public Sub Main()

 Dim pl As MediaPipeline
 Dim src As MediaControl

   src = New MediaControl(pl, "playbin")
   src["uri"] = "http://radiogalileo.it:8000/live"

   pl.Play()

   While True
     Sleep 0.01
   Wend

End
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 16 Febbraio 2017, 12:59:10
t'assicuro che avevo fatto una cosa del genere ...

il test con laybin l'ho fatto ieri sera alla riunione del Linux User Group e funzionava, mentre sul pc dell'ufficio mi dava errore:

Citazione
gst-launch-0.10 -v playbin uri=http://radiogalileo.it:8000/liveImpostazione della pipeline a PAUSED ...
ERRORE: la pipeline non vuole mettersi in pausa.
Elemento mancante: Sorgente protocollo HTTP
ERRORE: dall'elemento /GstPlayBin:playbin0: Per riprodurre questo stream è richiesto un plugin Sorgente protocollo HTTP, che però non risulta installato.
Informazioni di debug aggiuntive:
gstplaybasebin.c(1686): gen_source_element (): /GstPlayBin:playbin0:
No URI handler for http
Impostazione della pipeline a NULL ...
Esecuzione di free sulla pipeline...

quindi mi ero un po' scoraggiato ....

per far andare la riproduzione da bash ho dovuto installare proprio  gst-launch-1.0 con:
sudo apt install gstreamer1.0-tools

Che differenza fara' con quelli che avevo nel sistema (gst-launch / gst-launch-0.10 / gst-launch-1.0) non so proprio ....
cioe' la versione 0.10 e 1.0 lo so, ma che bisogno c'era anche della versione senza numeri? CONFUSIONE  :hard: :hard:
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 16 Febbraio 2017, 15:12:26
Che differenza fara' con quelli che avevo nel sistema (gst-launch / gst-launch-0.10 / gst-launch-1.0) non so proprio ....
cioe' la versione 0.10 e 1.0 lo so, ma che bisogno c'era anche della versione senza numeri? CONFUSIONE  :hard: :hard:

Hai fatto bene ad aggiornare GStreamer.

Comunque sia, di questa pagina:

https://gstreamer.freedesktop.org/documentation/application-development/appendix/porting-1.0.html

leggiti in particolare i primi due punti.
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 16 Febbraio 2017, 22:41:31
per ora ho individuato come fare in bash la pipeline che usa jack per riprodurre l'audio:
Citazione
gst-launch-1.0 playbin uri=http://radiogalileo.it:8000/live name=play  audio-sink="jackaudiosink"

ora la devo convertire in codice ...

questo non funziona

Codice: [Seleziona]
Public Sub Form_Open()
Dim pl As MediaPipeline
Dim src, prs, cnv, snk As MediaControl
 
   pl = New MediaPipeline
   
   src = New MediaControl(pl, "playbin")
   src["uri"] = "http://vps222134.ovh.net:8000/low_bitrate_lo_latency"
   src["name"] = "play"
   src["audio-sink"] = "jackaudiosink"
   pl.Play()

  While Not Eof
    Sleep 0.1
  Wend

End
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 16 Febbraio 2017, 22:45:33
ora la devo convertire in codice
...vediamo chi arriva primo.    ;D

...ma tu tanto non corri !    :-\
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 16 Febbraio 2017, 22:52:12
gia' lo sai :D
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 16 Febbraio 2017, 22:55:20
...però io non ho nessuna base come te con quel codice bash che hai scritto !    (http://s8.patient.media/forums/emoticons/sad.gif)
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 16 Febbraio 2017, 22:58:12
cioe' non esce nessun audio?

jack server sta girando si?
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 16 Febbraio 2017, 23:11:42
...per ora sono al livello di uso delle funzioni esterne con Extern:    :D

Codice: [Seleziona]
Library "libgstreamer-1.0"

Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
Private Const GST_FORMAT_TIME As Integer = 3

' gst_init (int *argc, char **argv[])
' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.
Private Extern gst_init(argc As Pointer, argv As Pointer)

' GstElement * gst_parse_launch (const gchar *pipeline_description, GError **error)
' Create a new pipeline based on command line syntax.
Private Extern gst_parse_launch(description As String, GError As Pointer) As Pointer

' GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)
' Sets the state of the element.
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer
 
' gboolean gst_element_query_position (GstElement *element, GstFormat format, gint64 *cur)
' Queries an element for the stream position in nanoseconds.
Private Extern gst_element_query_position(gstelement As Pointer, gstformat As Pointer, cur As Pointer) As Boolean

' void gst_object_unref(gpointer object)
' Decrements the reference count on object.
Private Extern gst_object_unref(gobject As Pointer)


Public Sub Main()
 
 Dim audio As Pointer
 Dim pos As Long
 Dim po As Date
     
  gst_init(0, 0)
 
  audio = gst_parse_launch("uridecodebin uri=http://radiogalileo.it:8000/live ! audioconvert ! audioresample ! jackaudiosink", 0)
       
' Avviamo l'esecuzione audio:
  gst_element_set_state(audio, GST_STATE_PLAYING)
 
  While True
    gst_element_query_position(audio, GST_FORMAT_TIME, VarPtr(pos))
    po = Date(0, 0, 0, 0, 0, 0, pos / 1000000)
    Write #File.Out, "\rTempo trascorso: " & po
  Wend
 
  gst_object_unref(audio)
     
End
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 17 Febbraio 2017, 18:19:37
http://radiogalileo.it:8000/live

....ma che 'sta radio è de Derni ?    ???
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 17 Febbraio 2017, 18:47:56
Dunque.... credo che tu sia costretto ad utilizzare la più generica Classe "MediaPlayer":

http://www.gambas-it.org/wiki/index.php?title=Riproduzione_dell%27audio_di_radio_WEB_mediante_il_Componente_gb.media#Uso_delle_Classi_MediaPlayer_e_MediaControl_e_del_plug-in_jackaudiosink


Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: allegfede - 19 Febbraio 2017, 18:50:56
http://radiogalileo.it:8000/live

....ma che 'sta radio è de Derni ?    ???

la mia :D
Titolo: Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
Inserito da: vuott - 19 Febbraio 2017, 18:58:48
la mia :D

Ce stanno un saccu de modi pe' sentilla !

http://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Ascolto_radio_da_flusso_web