Autore Topic: visualizzare il livello (vumeter) di un file in play con with gstreamer vu-meter  (Letto 975 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
in allegato il progetto, che pero' era nato per rimpiazzare VLC come player degli streming delle mie sorgeti audio per il mio gateway ip2fm.

e' interessante che se si usa come sorgente audio il generatore di test, allora ovviamente il decoder MAD non deve essere incluso nella pipeline

e' invece indispensabile se si prende il file audio (per ora hardcoded)

la cosa incredibile pero' e' che con gli altri plug in sorgente, gli streaming audio non riesco proprio a farli riprodurre.

PS: se volete usare il server audio jack lo dovete lanciare ed avviare prima e poi connettere a mano i "fili virtuali".
« Ultima modifica: 10 Luglio 2018, 17:48:44 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Il problema che poni, quale è ?


PS: se volete usare il server audio jack lo dovete lanciare ed avviare prima e poi connettere a mano i "fili virtuali".
A me non appaiono in Jack i riferimenti al tuo progetto.    :-\
« 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
nessuna domanda per ora :D

era per condividere parte del codice se qualcuno volesse usare gstreamer per fare il play di un file audio mp3 e visualizzare il vumeter in real time :D
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
pero' se qualcuno ha una idea di perche' questo funziona (da shell):
gst-launch-1.0 uridecodebin uri=http://vps222134.ovh.net:8000/live ! audioconvert ! "audio/x-raw,format=S16LE,channels=2,rate=48000" ! autoaudiosink

ed il mi codice (sorgente streaming) no ... mi potrebbe essere utile.

come si dice "two occh is mel che one"
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
come si dice "two occh is mel che one"

...partiamo male: il tuo avatar è orbo da un occhio !    :-X
« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
...probabilmente il plug-in "uridecodebin" mostra qualche incompatibilità con il Componente gb.media .   :-\

Puoi però usare quel plug-in con le funzioni esterne di GStreamer:
Codice: [Seleziona]
Private audio As Pointer


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_duration(GstElement *element, GstFormat format, gint64 *duration)
' Queries an element for the total stream duration in nanoseconds.
Private Extern gst_element_query_duration(gselement As Pointer, formatI As Integer, duration As Pointer) As Boolean
 
' 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 pos, dur As Long
 Dim po, du As Date
     
  gst_init(0, 0)
 
  audio = gst_parse_launch("uridecodebin uri=http://vps222134.ovh.net:8000/live ! audioconvert ! audio/x-raw,format=S16LE,channels=2,rate=48000 ! autoaudiosink", 0)
' Avviamo la riproduzione audio:
  gst_element_set_state(audio, GST_STATE_PLAYING)
 
  Do
    Wait 0.01
  Loop
 
  Termina()
         
End


Public Sub Application_Read()

Dim s As String

 Input s
 
 Select Case s
   Case "p"
' Pone in pausa la riproduzione audio:
     gst_element_set_state(audio, GST_STATE_PAUSED)
   Case "r"
' Riprende la riproduzione audio:
     gst_element_set_state(audio, GST_STATE_PLAYING)
   Case "s"
' Arresta la riproduzione audio:
     gst_element_set_state(audio, GST_STATE_NULL)
     Termina()
 End Select

End


Private Procedure Termina()
 
  gst_object_unref(audio)
  Print "\nEsecuzione terminata."
  Quit
 
End
« Ultima modifica: 16 Luglio 2018, 17:57:22 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
due occhi nel senso di UNO mio ed Uno tuo :D

"gst_parse_launch" e' fighissimo!!!!

e' un suggeriemnto sciccosissimo che potrebbe risolvere tante grane e far risparmiare tanto temo!!!

Grazie.

PS: ho aggiunto questa sub per avere la posizione (partendo dai suggerimenti di VUOTT):
Codice: [Seleziona]
Public Sub Timer_status_Timer()

  gst_element_query_position(audio, GST_FORMAT_TIME, VarPtr(dur))
  Label_status.Text = dur / 1000000000

End

ma mi chiedevo se c'era un modo semplice e veloce per fare la divisione per 1 miliardo (tipo uno shift) per evitare di dover usare una procedura costosa come la divisione per un numero arbitrorio di un valore che e' conteggiato in nonosecondi .....
« Ultima modifica: 16 Luglio 2018, 18:15:34 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
ma se io modifico la linea di avvio riproduzione cosi':

Codice: [Seleziona]
audio = gst_parse_launch("uridecodebin uri=" & SourceURL & " ! audioconvert ! audio/x-raw,format=S16LE,channels=2,rate=48000 ! level ! " & serverAudio, 0)

che funziona ....

e aggiungendo questo nell'inizializzazione del programma:
Codice: [Seleziona]
' Gambas class file

Private audio As Pointer  'puntatore all'oggetto pipeline che verra' riprodotta

Library "libgstreamer-1.0"

......

'per i messaggi del plug in level
Private Extern gst_structure_get_value(struttura As Pointer, tipologia As String) As Integer[] 'poiche' noi vorremmo in C una cosa tipo: array_val = gst_structure_get_value (s, "rms");

Private S As Pointer  'la definizione in c e': const GstStructure * s = gst_message_get_structure(message);

come faccio a "legare" l'oggetto message che gstreamer inizializza con la mia richiesta di informazioni (messaggi)?
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
« 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. »