Autore Topic: errore nella pipeline di riproduzione di gstreamer  (Letto 1212 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
errore nella pipeline di riproduzione di gstreamer
« il: 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 ...
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #1 il: 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 ....
« Ultima modifica: 18 Dicembre 2018, 19:20:19 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.683
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #2 il: 18 Dicembre 2018, 20:47:03 »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #3 il: 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
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.683
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #4 il: 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.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #5 il: 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
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.683
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #6 il: 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).
« Ultima modifica: 19 Dicembre 2018, 16:42:52 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #7 il: 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
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.683
  • Ne mors quidem nos iunget
    • Mostra profilo
« Ultima modifica: 19 Dicembre 2018, 20:32:40 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #9 il: 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
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #10 il: 19 Dicembre 2018, 19:14:49 »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #11 il: 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 ....
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.683
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #12 il: 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.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:errore nella pipeline di riproduzione di gstreamer
« Risposta #13 il: 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]) ......
se corri, morirai stanco (motto degli sniper)