Eseguire i file video con il Componente gb.media
Il componente gb.media offre la possibilità di sfruttare le funzionalità della piattaforma multimediale modulare GStreamer per la gestione di file video.
E' possibile eseguire i file video utilizzando la Classe MediaPlayer oppure le risorse delle Classi MediaPipeline e MediaControl.
Si potrà scegliere se far mostrare il video in un controllo GUI (ad esempio una DrawingArea) posto sul Form, oppure in una finestra automaticamente aperta dalle risorse del componente gb.media. Nel caso si utilizzi una DrawingArea, bisogna impostare un qualsiasi colore la sua proprietà .Background.
Indice
Eseguire un video con la Classe MediaPlayer
Mostreremo di seguito alcuni esempi per eseguire un file video mediante le risorse della Classe MediaPlayer.
Eseguire il video in uno specifico controllo GUI posto sul form
Nel seguente esempio il video verrà mostrato in all'interno di uno specifico controllo GUI (ad esempio una DrawingArea) posto sul Form:
Private mp As MediaPlayer Public Sub Form_Open() Dim da As DrawingArea ' Crea una "DrawingArea" come oggetto GUI da usare per l'uscita video: With da = New DrawingArea(Me) .X = 10 .Y = 10 .W = 300 .H = 300 .Background = Color.Black End With With mp = New MediaPlayer .URL = Media.URL("/percorso/del/file/video") ' Imposta il controllo dell'uscita video da usare: .SetWindow(da) ' [Nota 1] End With End Public Sub Button1_Click() ' Esegue il file video: mp.Play() Repeat ' Una brevissima pausa consente di mostrare e di agire sugli eventuali oggetti posti sul Form: Wait 0.01 TextLabel1.Text = "\rDurata del video: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000)) Until mp.Position >= mp.Duration End Public Sub Button2_Click() mp.Stop mp.Close End Public Sub ToggleButton1_Click() If ToggleButton1.Value Then mp.Pause Else mp.Play Endif End
Eseguire il video in una finestra automaticamente aperta da Gstreamer
E' possibile far mostrare il video in una finestra automaticamente aperta da Gstreamer all'esterno del Form. Ovviamente non verrà impostato alcuno specifico controllo grafico GUI.
Anche questa finestra, volendo, può essere gestita mediante le Classi Desktop e DesktopWindow attivando i componenti gb.desktop e gb.desktop.x11.
Mostriamo un semplice esempio in ambiente grafico:
Private mp As New MediaPlayer Public Sub Form_Open() mp.URL = Media.URL("/percorso/del/file/video") End Public Sub Form_Activate() ' Esegue il video: mp.Play() Repeat ' Una brevissima pausa consente di agire sugli eventuali oggetti posti sul Form: Wait 0.01 TextLabel1.Text = "\rDurata del video: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000)) Until mp.Position >= mp.Duration mp.Stop End Public Sub Button1_Click() mp.Stop End Public Sub ToggleButton1_Click() If ToggleButton1.Value Then mp.Pause Else mp.Play Endif End
Eseguire un video in un'applicazione a linea di comando
Vediamo ora un esempio con un'applicazione a linea di comando.
Si potrà chiudere il programma durante l'esecuzione del file video semplicemente premendo sul tasto "Invio":
Private bo As Boolean Public Sub Main() Dim mp As MediaPlayer With mp = New MediaPlayer .URL = Media.URL("/percorso/del/file/video") .Play() Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) Repeat ' Mostra in console la posizione, espressa in secondi, all'interno dei dati processati: Write "\r\e[0mTempo trascorso: \e[1m\e[31m" & Str(Time(0, 0, 0, .Position * 1000)) Wait 0.01 Until (mp.Position >= mp.Duration) Or bo .Stop .Close End With ' Avendo utilizzato l'Evento "Application_Read()", è necessario invocare l'istruzione "Quit" per terminare il programma: Quit End Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera, si arresta il programma bo = True End
Esecuzione di un video da un indirizzo web
Va precisato che, se il video da eseguire ha un indirizzo web, allora alla Proprietà ".Url" della Classe MediaPlayer va passato direttamente l'indirizzo web del video:
With mp = New MediaPlayer .URL = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm"
Eseguire un file video usando il plugin "Playbin" mediante la Classe MediaPipeline
Mostriamo due esempi, nei quali il flusso audio-video sarà gestito dal plugin "playbin" richiamando le Classi MediaPipeline e MediaControl.
Con applicazione a "riga di comando"
Private pl As MediaPipeline Public Sub Main() Dim bin As MediaControl Dim filevideo As String filevideo = Uri("/percorso/del/file/video") pl = New MediaPipeline As "Pipe" bin = New MediaControl(pl, "playbin") bin["uri"] = filevideo bin["volume"] = 0.6 ' Volume: da 0.00 a 1.0 pl.Play Print "\r\e[0mDurata del video: "; Time(0, 0, 0, pl.Duration * 1000) ' Pone un'attesa pari alla durata del video, per farlo eseguire sino alla fine: Wait pl.Duration pl.Stop pl.Close ' Consente di terminare il programma evitando l'uso di 'Quit' pl = Null Write "\n\e[0mEsecuzione terminata !" End Private Function Uri(s As String) As String Return "File:/" &/ s End
Con applicazione grafica
In quest'altro esempio utilizzeremo un progetto grafico, nel quale il video sarà mostrato all'interno di una "DrawingArea" posta sul "Form" principale
Private pl As MediaPipeline Public Sub Button1_Click() Dim bin As MediaControl Dim filevideo As String filevideo = Uri("/percorso/del/file/video") pl = New MediaPipeline As "Pipe" bin = New MediaControl(pl, "playbin") bin["uri"] = filevideo bin["volume"] = 0.6 ' Volume: da 0.00 a 1.0 ' Imposta la superficie grafica ove mostrare il video: bin.SetWindow(DrawingArea1) pl.Play Wait pl.Duration pl.Stop pl.Close Me.Text = "Esecuzione terminata !" End Private Function Uri(s As String) As String Return "File:/" &/ s End Public Sub Pipe_Position() Me.Text = "Durata video: " & Str(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000)) End
Esecuzione di un video da un indirizzo web
Va precisato che con il plug-in "playbin" alla sua Proprietà "uri" si passerà il percorso del file video, anticipato dal prefisso "File:/".
Se, invece, il video da eseguire ha un indirizzo web, allora alla predetta Proprietà "uri" va passato direttamente l'indirizzo web del video:
bin = New MediaControl(pl, "playbin") bin["uri"] = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm"
Note
[1] Riguardo all'Oggetto grafico da usare con il Metodo ".SetWindow()" della Classe "MediaPlayer", B. Minisini ha chiarito che esso necessita di un controllo che avesse una vera finestra X11 (o Wayland), altrimenti si userà il primo controllo genitore con una finestra reale, che di solito è quella di primo livello.