Eseguire i file video con il Componente gb.media

Da Gambas-it.org - Wikipedia.

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.

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)
  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()
  
 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 ciasun 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:

Public Sub Main()
 
 Dim pl, pl2 As New MediaPipeline
 Dim src As MediaControl
 Dim tee As MediaControl
 Dim bin, con, res, ask As MediaControl
 Dim bin2, vid, vsk As MediaControl
 Dim filevideo As String
 Dim d1, d2 As Date
 
 filevideo = "' /percorso/del/file/video"
 
 src = New MediaControl(pl, "filesrc")
 src["location"] = filevideo
 
 tee = New MediaControl(pl, "tee")
 que1 = New MediaControl(pl, "queue")
 que2 = 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)
 
 tee.LinkTo(bin)
 bin.LinkLaterTo(ask)
 
 tee.LinkTo(bin2)
 bin2.LinkLaterTo(vid)
 vid.LinkTo(vsk)
 
 pl.Play
 
 Repeat
   Wait 0.001
   d1 = Date(0, 0, 0, 0, 0, 0, pl.pos * 1000)
   d2 = Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000)
   Write "\rTempo trascorso: \e[31m" & Str(d1) & "\e[0m  -  Durata del video: " &
   Str(d2) &
   "  -  Tempo rimanente: " & Str(Date(0, 0, 0, 0, 0, 0, DateDiff(d1, d2, gb.Millisecond)))
 Until pl.Pos >= pl.Duration 
 
 pl.Stop
 pl.Close
 Quit
 
End

Vedi anche: Duplicare il flusso di dati dividendo una pipeline della Classe MediaPipeline del componente gb.media