Gambas-it

Gambas3 => Programmazione => Topic aperto da: allegfede - 13 Dicembre 2018, 18:38:33

Titolo: errore nella pipeline di riproduzione di gstreamer
Inserito da: allegfede - 13 Dicembre 2018, 18:38:33
il programma in allegato fa' uso di:
jackaudio server (che deve essere istallato)
del gestore qjackctl (che deve essere installato)
di gstreamer e della aposita libreria di gestione gb.media
ed ovviamente di gambas.

alla pressione del tasto play dovrebbe connettersi alla "web radio" il cui URL avete impostato nelle preferenze (tasto in basso a destra), ma che adesso ho "hardcoded" ad un flusso che so essere funzionante ....

pero', mentre le pipeline lanciate da shell mi funzionano tutte:
gst-launch-1.0 uridecodebin uri=http://radiogalileo.it:8000//low_latency  ! audioconvert ! jackaudiosink
gst-launch-1.0 uridecodebin uri=http://radiogalileo.it:8000//low_latency  ! audioconvert ! level ! jackaudiosink
gst-launch-1.0 uridecodebin uri=http://radiogalileo.it:8000//low_latency  !  decodebin ! audioconvert ! level ! jackaudiosink

da codice non riesco neanche a connettere la sorgente con il resto degli elementi nella pipeline ...

ho spulciato gli esempi nella wiki e penso di non essermi allontanato troppo .... ma non riesco a venirne a capo ...
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: allegfede - 18 Dicembre 2018, 16:06:00
parafrasando questa guida nella wiki:
http://www.gambas-it.org/wiki/index.php?title=Analizzare_il_valore_RMS,_il_picco_e_il_decay_dei_dati_audio_mediante_il_plugin_%27level%27usando_una_linea_di_pipeline_con_la_funzione_%27gst_parse_launch()%27

cambiando le linee:
Codice: [Seleziona]
fileaudio = "/percorso/del/file.wav"
   
  gst_init(0, 0)
 
  lp = g_main_loop_new(0, False)
 
' Imposta gli elementi necessari per l'analisi del file audio:
  lev = gst_parse_launch("filesrc location=" & fileaudio & " ! wavparse ! audioconvert ! level interval=1000000 ! audio/x-raw,channels=2 ! fakesink", 0)
con:
Codice: [Seleziona]
fileaudio = "http://radiogalileo.it:8000/low_latency"
   
  gst_init(0, 0)
 
  lp = g_main_loop_new(0, False)
 
' Imposta gli elementi necessari per l'analisi del file audio:
  lev = gst_parse_launch("uridecodebin uri=" & fileaudio & " ! decodebin ! audioconvert ! level interval=1000000  ! jackaudiosink", 0)

suona e analizza.

Pero' mi chiedo perche' utilizzando i metodi interni del componente gb.media la cosa non vada ....
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: vuott - 18 Dicembre 2018, 20:47:03
Il flusso di dati audio:
"http://radiogalileo.it:8000/low_latency"
che tipo di formato è ?
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: allegfede - 19 Dicembre 2018, 12:19:04
in questo caso il server e' un server ICECAST che suppongo sia un http transport, il flusso audio e' un aac plus 48Khz a 56Kbps

pero' l'idea e' di avere una sorgente che "automaticamente" interpreti il formato del flusso.

da quello che noto, URIDECODEBIN dovrebbe fare questo, ovvero adeguare i suoi componenti interni (e' una specie di metaoggetto) al formato dell' URI in ingresso.

da shell funziona, da "libreria" chiamata in gambas pure ... usando gli stessi oggetti con gb.media si blocca nella fase di interconnessione del SOURCE

PS: se non volete usare jackaudio server , sostituite jackaudiosink con pulseaudiosink o con autoaudiosink
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: vuott - 19 Dicembre 2018, 12:56:31
da quello che noto, URIDECODEBIN dovrebbe fare questo, ovvero adeguare i suoi componenti interni (e' una specie di metaoggetto) al formato dell' URI in ingresso.

L'analisi è corretta.



da shell funziona, da "libreria" chiamata in gambas pure ... usando gli stessi oggetti con gb.media si blocca nella fase di interconnessione del SOURCE
Anche questo è vero: io pure ho constatato sempre che, usando i plugin di GStreamer che terminano con -bin (playbin, decodebin, etc), non è possibile con il Componente gb.media collegarli ad altri plugin necessari mediante il Metodo .LinkTo( ).



in questo caso il server e' un server ICECAST che suppongo sia un http transport, il flusso audio e' un aac plus 48Khz a 56Kbps
In tal caso si dovrebbe usare il plugin di GStreamer che decodifica il formato audio "aac".


pero' l'idea e' di avere una sorgente che "automaticamente" interpreti il formato del flusso.
L'individuazione in sé del tipo di formato audio non è poi una cosa difficile.
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: allegfede - 19 Dicembre 2018, 15:53:44
Citazione
Anche questo è vero: io pure ho constatato sempre che, usando i plugin di GStreamer che terminano con -bin (playbin, decodebin, etc), non è possibile con il Componente gb.media collegarli ad altri plugin necessari mediante il Metodo .LinkTo( ).

e questo mi rattrista moltissimo :-(

chi e' il mantainer di gb.media? devo stalkerizzarlo! :D
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: vuott - 19 Dicembre 2018, 16:41:41
Codice: [Seleziona]
' Imposta gli elementi necessari per l'analisi del file audio:
  lev = gst_parse_launch("filesrc location=" & fileaudio & " ! wavparse ! audioconvert ! level interval=1000000 ! audio/x-raw,channels=2 ! fakesink", 0)
...insomma, potresti provare utilizzando il decodificatore per il formato AAC (anziché quello per il WAV).
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: allegfede - 19 Dicembre 2018, 17:12:04
forse dovrei anche usare come sorgente uno shoutsrc piu' che un filesrc :D

pero' per ora mi accontento della libreia esterna (amche se ho gia' postato la questione a minisini su sourceforge) ;-)

al link la versione con cambio dinamico dell'url della radio da streammare (ora voglio intercettare i metadati dello streming :D):

https://sourceforge.net/projects/pi2fm/files/gstreamer_webradio_play_test-0.0.2.tar.gz/download
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: vuott - 19 Dicembre 2018, 17:21:59
...ma di 'sto argomento non s'era già trattato ?   ??? :-X

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:errore nella pipeline di riproduzione di gstreamer
Inserito da: Gianluigi - 19 Dicembre 2018, 17:46:20
Mi intrometto solo per rammentare che bugtracker è sempre lo stesso mentre la mailing list si è spostata da sourceforge a qui:
https://lists.gambas-basic.org/listinfo/user
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: Gianluigi - 19 Dicembre 2018, 19:14:49
chi e' il mantainer di gb.media? devo stalkerizzarlo! :D

http://gambaswiki.org/wiki/comp/gb.media  :P
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: allegfede - 21 Dicembre 2018, 19:38:52
allora, minisini mi ha dato uno spunto di elaborazione.

I componenti "BIN" (uridecodebin, decodebin, etc) creano i pad al momento del collegamento dei media veri e propri (quando ricevono i dati audio ed iniziano a capire come decodificarli).

Quindi NON si puo' usare il metodo "LinkTo" ma va usato il metodo "LinkLATERto".

In questo modo riesco a creare il player (senza errori), ma ancora non sento l'audio ....
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: vuott - 22 Dicembre 2018, 01:17:16
Quindi NON si puo' usare il metodo "LinkTo" ma va usato il metodo "LinkLATERto".
In passato avevo intuito questa cosa, ma pur facendo alcuni tentativi non ero mai riuscito a risolvere il problema.
Devo riprovare anche con gli altri casi.
Titolo: Re:errore nella pipeline di riproduzione di gstreamer
Inserito da: allegfede - 22 Dicembre 2018, 13:47:00
ho analizzato a fondo i messaggi che passano per la pipeline .. e mettendo i watchdog nella procedura di gestione dei messaggi (dove leggo i livelli per i vumeter), mi sembra che tutto vada bene.

cambiano i valori di RMS, scorre il valore di "endtime" (in pratica da quanto tempo sta riproducendo l'audio).

MA, se tolgo i watchdog, e lascio il programma girare alla "massima" velocita' ... la pipeline si schianta dopo una manciata di campioni (dipende dalla dimensione del buffer impostato in Public Sub InitSource()[/b]) ......