Gestione dei dati media creando una libreria .so personalizzata con le funzioni esterne del API di GStreamer
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 essendo un componente, ma restando una mera libreria esterna non ci obbliga ad installarla nel nostro sistema, consentendoci così di crearla e di gestirla con l'applicazione principale Gambas in maniera molto elastica e semplice. Il codice sorgente verrà quindi scritto all'interno dell'applicazione Gambas che utilizzerà 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() Dim durata As Long p = CaricaFile("/percorso/del/file/media") Tempus.Start durata = Esegue(p) Print "Durata: "; CStr(Date(0, 0, 0, 0, 0, 0, durata / 1000000)) End Public Sub Button2_Click() Stop(p) Tempus.Stop End Public Sub ToggleButton1_Click() 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 #File.Out, "\rPosizione: " & Date(0, 0, 0, 0, 0, 0, posizione / 1000000) 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