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.
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
- 1 Eseguire il video in uno specifico controllo GUI posto sul form
- 2 Eseguire il video in una finestra automaticamente aperta da Gstreamer
- 3 Eseguire un video in un'applicazione a linea di comando
- 4 Eseguire un file video duplicando il flusso dei dati audio-video di una pipeline della Classe MediaPipeline
- 5 Note
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() Do ' Una brevissima pausa consente di mostrare e di agire sugli eventuali oggetti posti sul Form: Wait 0.01 TextLabel1.Text = "\rDurata del video: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Duration * 1000)) & " - Tempo trascorso: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Position * 1000)) Loop 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() Do ' Una brevissima pausa consente di agire sugli eventuali oggetti posti sul Form: Wait 0.01 TextLabel1.Text = "\rDurata del video: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Duration * 1000)) & " - Tempo trascorso: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Position * 1000)) Loop 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 audio semplicemente premendo sul tasto "Invio":
Private bo As Boolean Public Sub Main() Dim mp As New MediaPlayer mp.URL = Media.URL("/percorso/del/file/video") ' Esegue il brano: mp.Play() ' Garantisce l'acquisizione della "durata" del video, affinché non si esca prematuramente dal ciclo successivo e venga così eseguito il file: Repeat Wait 0.01 Until mp.Duration > 0 Repeat Write "\rDurata del video: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Duration * 1000)) & " - Tempo trascorso: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Position * 1000)) Wait 0.001 Until (mp.Position >= mp.Duration) Or (bo = True) mp.Close Quit End Public Sub Application_Read() bo = True End
Eseguire un file video duplicando il flusso dei dati audio-video di una pipeline della Classe MediaPipeline
Duplicando il flusso audio-video di un Oggetto pipeline della Classe MediaPipeline del componente gb.media, consente di gestire ciascun flusso in modo del tutto autonomo.
La divisione del flusso audio principale è compiuta con l'elemento "Tee".
Ciascun flusso sarà poi gestito dagli specifici plugin di GStreamer per ottenere l'uscita audio e quella video. La decodifica (parsing) dei dati di ciascun flusso sarà effettuata in particolare dal plugin "decodebin".
Si useranno le Classi MediaPipeline e MediaControl.
Mostriamo un esempio pratico:
Private bo As Boolean Private pl As MediaPipeline Public Sub Main() Dim src As MediaControl Dim tee, que As MediaControl Dim bin, con, res, ask As MediaControl Dim bin2, vid, vsk As MediaControl Dim filevideo As String filevideo = "/percorso/del/file/video" pl = New MediaPipeline As "PL" src = New MediaControl(pl, "filesrc") src["location"] = filevideo tee = New MediaControl(pl, "tee") que = New MediaControl(pl, "queue") bin = New MediaControl(pl, "decodebin") con = New MediaControl(pl, "audioconvert") res = New MediaControl(pl, "audioresample") ask = New MediaControl(pl, "autoaudiosink") bin2 = New MediaControl(pl, "decodebin") vid = New MediaControl(pl, "videoconvert") vsk = New MediaControl(pl, "autovideosink") src.LinkTo(tee) ' Ramo del flusso per la decodifica audio: tee.LinkTo(que) que.LinkTo(bin) bin.LinkLaterTo(con) con.LinkTo(ask) ' Ramo del flusso per la decodifica video: tee.LinkTo(bin2) bin2.LinkLaterTo(vid) vid.LinkTo(vsk) pl.Play Repeat Wait 0.01 Until pl.Duration > 0 Print "Durata del video: "; Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) Repeat Write "\r\e[0mTempo trascorso: \e[31m" & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) Wait 0.01 Until bo == True pl.Stop pl.Close pl = Null ' Consente di terminare il programma evitando l'uso di 'Quit' Write "\n\e[0mEsecuzione terminata !" End Public Sub PL_End() bo = True End
Vedi anche: Duplicare_il_flusso_dei_dati_audio_di_una_pipeline_della_Classe_MediaPipeline_del_componente_gb.media
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 ayland), altrimenti se userà il primo controllo genitore con una finestra reale, che di solito è quella di primo livello.