Differenze tra le versioni di "Gestione dei dati media creando una libreria .so personalizzata con le funzioni esterne del API di GStreamer"

Da Gambas-it.org - Wikipedia.
 
Riga 20: Riga 20:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
 
   ScriveLibreria()
 
   ScriveLibreria()
Riga 28: Riga 28:
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()  <FONT Color=gray>' ''Cliccando su questo tasto, si avvia la riproduzione audio:''</font>
 
    
 
    
  Dim durata As Long
+
  Dim durata As Long
 
    
 
    
   p = CaricaFile("''/percorso/del/file/media''")
+
   p = CaricaFile("<FONT Color=darkgreen>''/percorso/del/file/media''</font>")
 
    
 
    
 
   Tempus.Start
 
   Tempus.Start
Riga 41: Riga 41:
 
   durata = Esegue(p)
 
   durata = Esegue(p)
 
    
 
    
   Print "Durata: "; CStr(Date(0, 0, 0, 0, 0, 0, durata / 1000000))
+
   Print "Durata: "; Time(0, 0, 0, durata / 1000000)
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button2_Click()
+
  Public Sub Button2_Click()  <FONT Color=gray>' ''Cliccando su questo tasto, si arresta la riproduzione audio:''</font>
 
    
 
    
 
   Stop(p)
 
   Stop(p)
Riga 52: Riga 52:
 
   Tempus.Stop
 
   Tempus.Stop
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub ToggleButton1_Click()
+
  Public Sub ToggleButton1_Click()  <FONT Color=gray>' ''Per mettere in pausa e poi riprendere la riproduzione audio:''</font>
 
    
 
    
 
   If ToggleButton1.Value Then
 
   If ToggleButton1.Value Then
Riga 65: Riga 65:
 
   Endif
 
   Endif
 
   
 
   
  ''' End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Tempus_Timer()
+
  Public Sub Tempus_Timer()
 
   
 
   
  Dim posizione As Long
+
  Dim posizione As Long
 
    
 
    
 
   posizione = Tempo(p)
 
   posizione = Tempo(p)
 
    
 
    
   Write #File.Out, "\rPosizione: " & Date(0, 0, 0, 0, 0, 0, posizione / 1000000)
+
   Write "\rPosizione: " & Time(0, 0, 0, posizione / 1000000)
 +
  Flush
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure ScriveLibreria()
+
  Private Procedure ScriveLibreria()
 
    
 
    
  Dim s As String
+
  Dim s As String
 
    
 
    
 
   s = "#include <gstreamer-1.0/gst/gst.h>\n#include <unistd.h>\n" &  <FONT Color=gray>' ''Specifica le librerie necessarie''</font>
 
   s = "#include <gstreamer-1.0/gst/gst.h>\n#include <unistd.h>\n" &  <FONT Color=gray>' ''Specifica le librerie necessarie''</font>
Riga 117: Riga 118:
 
       Shell "gcc -o /tmp/LibreriaGSTR.so  /tmp/LibreriaGSTR.c -shared -fPIC `pkg-config --cflags --libs gstreamer-1.0`" Wait
 
       Shell "gcc -o /tmp/LibreriaGSTR.so  /tmp/LibreriaGSTR.c -shared -fPIC `pkg-config --cflags --libs gstreamer-1.0`" Wait
 
    
 
    
  '''End'''
+
  End

Versione attuale delle 15:13, 4 lug 2024

In questa pagina mostreremo come creare una nostra libreria dinamica condivisa .so esterna, il cui sorgente verrà scritto in linguaggio C, con le funzioni esterne della libreria di GStreamer

Tale libreria esterna .so sarà personalizzata, nelsenso che verranno create alcune essenziali funzioni per la gestione dei dati di file mediali. Le funzioni di questa nostra libreria .so verranno ovviamente richiamate ed utilizzate all'interno di un'applicazione Gambas.

Questa risorsa, non dovendo diventare un Componente del nostro Gambas, ma restando una mera libreria esterna, non ci obbliga ad installarla nel nostro sistema, e ci consente così di crearla e di gestirla direttamente con l'applicazione Gambas in maniera molto elastica e semplice. Il codice sorgente verrà quindi scritto all'interno dell'applicazione Gambas che utilizzerà poi le sue funzioni.

Mostriamo un esempio pratico:

Private p As Pointer
Private Tempus As Timer


Library "/tmp/LibreriaGSTR"

Private Extern CaricaFile(nombrefile As String) As Pointer
Private Extern Esegue(GSelement As Pointer) As Long
Private Extern Stop(GSelement As Pointer) As Integer
Private Extern Pausa(GSelement As Pointer) As Integer
Private Extern Continua(GSelement As Pointer) As Integer
Private Extern Tempo(GSelement As Pointer) As Long


Public Sub Form_Open()
 
  ScriveLibreria()
 
  With Tempus = New Timer As "Tempus"
   .Delay = 70
  End With
 
End


Public Sub Button1_Click()   ' Cliccando su questo tasto, si avvia la riproduzione audio:
 
  Dim durata As Long
 
  p = CaricaFile("/percorso/del/file/media")
  
  Tempus.Start
   
  durata = Esegue(p)
  
  Print "Durata: "; Time(0, 0, 0, durata / 1000000)
  
End


Public Sub Button2_Click()   ' Cliccando su questo tasto, si arresta la riproduzione audio:
 
  Stop(p)
 
  Tempus.Stop
 
End


Public Sub ToggleButton1_Click()   ' Per mettere in pausa e poi riprendere la riproduzione audio:
 
  If ToggleButton1.Value Then
    Pausa(p)
    Tempus.Stop
  Else
    Continua(p)
    Tempus.Start
  Endif

End


Public Sub Tempus_Timer()

  Dim posizione As Long
 
  posizione = Tempo(p)
  
  Write "\rPosizione: " & Time(0, 0, 0, posizione / 1000000)
  Flush
  
End


Private Procedure ScriveLibreria()
 
  Dim s As String
 
  s = "#include <gstreamer-1.0/gst/gst.h>\n#include <unistd.h>\n" &   ' Specifica le librerie necessarie
      "\nGstElement * CaricaFile(char *file) {" &   ' Scrive la funzione per caricare il file media
      "\nGstElement *pipeline;" &
      "\ngst_init (0, NULL);" &
      "\npipeline = gst_element_factory_make (\"playbin\", NULL);" &
      "\ng_object_set (pipeline, \"uri\", g_filename_to_uri(file, NULL, NULL), NULL);" &
      "\nreturn pipeline;\n}\n" &   ' Ritorna un "Puntatore"
      "\ngint64 Esegue(GstElement *pipeline) {" &   ' Scrive la funzione per eseguire il file media
      "\ngint64 durata;" &
      "\ngst_element_set_state(pipeline, GST_STATE_PLAYING);" &
      "\nusleep(1000000);" &
      "\ngst_element_query_duration(pipeline, GST_FORMAT_TIME, &durata);" &
      "\nreturn durata;\n}\n" &   ' Ritorna la durata della esecuzione del file media
      "\nint Pausa(GstElement *pipeline) {" &   ' Scrive la funzione per porre in pausa l'esecuzione del file media
      "\ngst_element_set_state (pipeline, GST_STATE_PAUSED);" &
      "\nreturn 0;\n}\n" &   ' Se non vi sono errori, ritorna il valore 0
      "\nint Continua(GstElement *pipeline) {" &   ' Scrive la funzione per proseguire l'esecuzione del file precedentemente posto in pausa
      "\ngst_element_set_state(pipeline, GST_STATE_PLAYING);" &
      "\nreturn 0;\n}\n" &   ' Se non vi sono errori, ritorna il valore 0
      "\nint Stop(GstElement *pipeline) {" &   ' Scrive la funzione per terminare l'esecuzione del file media
      "\ngst_element_set_state (pipeline, GST_STATE_NULL);" &
      "\ngst_object_unref (pipeline);" &
      "\nreturn 0;\n}\n" &   ' Se non vi sono errori, ritorna il valore 0
      "\ngint64 Tempo(GstElement *pipeline) {" &   ' Scrive la funzione per sapere cuanto tempo è passato dall'inizio dell'esecuzione del file media
      "\ngint64 positio;" &
      "\ngst_element_query_position(pipeline, GST_FORMAT_TIME, &positio);" &
      "\nreturn positio;\n}\n"   ' Ritorna il valore del tempo trascorso
 
' Salva il codice sorgente della nostra libreria .so personalizzata:
      File.Save("/tmp/LibreriaGSTR.c", s)
        
' Crea la nostra libreria .so personalizzata:
      Shell "gcc -o /tmp/LibreriaGSTR.so  /tmp/LibreriaGSTR.c -shared -fPIC `pkg-config --cflags --libs gstreamer-1.0`" Wait
  
End