Differenze tra le versioni di "Gestione dei dati media creando una libreria .so personalizzata con le funzioni esterne del API di GStreamer"
Riga 20: | Riga 20: | ||
− | + | Public Sub Form_Open() | |
ScriveLibreria() | ScriveLibreria() | ||
Riga 28: | Riga 28: | ||
End With | End With | ||
− | + | End | |
− | ''' | + | Public Sub Button1_Click() <FONT Color=gray>' ''Cliccando su questo tasto, si avvia la riproduzione audio:''</font> |
− | + | 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: "; | + | Print "Durata: "; Time(0, 0, 0, durata / 1000000) |
− | + | End | |
− | ''' | + | 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 | |
− | ''' | + | 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 | |
− | + | Public Sub Tempus_Timer() | |
− | + | Dim posizione As Long | |
posizione = Tempo(p) | posizione = Tempo(p) | ||
− | Write | + | 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" & <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 |
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