Differenze tra le versioni di "Eseguire i file video con il Componente gb.media"

Da Gambas-it.org - Wikipedia.
 
(38 versioni intermedie di uno stesso utente non sono mostrate)
Riga 3: Riga 3:
 
E' possibile eseguire i file video utilizzando la Classe ''MediaPlayer'' oppure le risorse delle Classi ''MediaPipeline'' e ''MediaControl''.
 
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''.
+
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''.
  
 +
Assicurarsi che siano installati nel proprio sistema i seguenti plugin di GStreamer:
 +
* gstreamer1.0-plugins-good
 +
* gstreamer1.0-plugins-bad
 +
* gstreamer1.0-plugins-ugly
 +
* gst-libav
  
 
=Eseguire un video con la Classe ''MediaPlayer''=
 
=Eseguire un video con la Classe ''MediaPlayer''=
Riga 15: Riga 20:
 
* la Proprietà ".Duration" per far eseguire il file video per l'intera sua durata;
 
* la Proprietà ".Duration" per far eseguire il file video per l'intera sua durata;
 
* il Metodo ".Close()" per chiudere il mediaplayer.
 
* il Metodo ".Close()" per chiudere il mediaplayer.
 
  
 
===Eseguire un video in un'applicazione ''a linea di comando''===
 
===Eseguire un video in un'applicazione ''a linea di comando''===
 
Vediamo ora un esempio con un'applicazione ''a linea di comando''.
 
Vediamo ora un esempio con un'applicazione ''a linea di comando''.
 
<BR>Si potrà chiudere il programma durante l'esecuzione del file video semplicemente premendo sul tasto "Invio":
 
<BR>Si potrà chiudere il programma durante l'esecuzione del file video semplicemente premendo sul tasto "Invio":
 +
Private mp As MediaPlayer
 
  Private bo As Boolean
 
  Private bo As Boolean
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
  Dim mp As MediaPlayer
 
 
    
 
    
   With mp = New MediaPlayer
+
   With mp = New MediaPlayer As "MPlayer"
     .URL = Media.URL("<FONT Color=gray>''/percorso/del/file/video''</font>")
+
     .URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/video''</font>")
 
     .Play()
 
     .Play()
 
     Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000)
 
     Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000)
 
     Repeat
 
     Repeat
<FONT color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:''</font>
 
      Write "\r\e[0mTempo trascorso: \e[1m\e[31m" & Str(Time(0, 0, 0, .Position * 1000))
 
 
       Wait 0.01
 
       Wait 0.01
     Until (mp.Position >= mp.Duration) Or bo
+
     Until bo
 
     .Stop
 
     .Stop
 
     .Close
 
     .Close
Riga 43: Riga 44:
 
   Quit
 
   Quit
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Application_Read() <FONT color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font>
+
  Public Sub MPlayer_Position()
 +
 +
<FONT color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:''</font>
 +
  Write "\r\e[0mTempo trascorso: \e[1m\e[31m" & Str(Time(0, 0, 0, mp.Position * 1000))
 +
  Flush
 +
 +
End
 +
 +
Public Sub Application_Read() <FONT color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font>
 
   
 
   
 
   bo = True
 
   bo = True
 
    
 
    
  '''End'''
+
  End
 
 
  
 
===Eseguire il video in uno specifico controllo GUI posto sul form===
 
===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:
 
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
 
  Private mp As MediaPlayer
 
 
 
   
 
   
  '''Public''' Sub Form_Open()
+
   
 +
Public Sub Form_Open()
 
   
 
   
 
   Dim da As DrawingArea
 
   Dim da As DrawingArea
Riga 69: Riga 77:
 
   End With
 
   End With
 
    
 
    
   With mp = New MediaPlayer
+
   With mp = New MediaPlayer As "MPlayer"
     .URL = Media.URL("<FONT color=gray>''/percorso/del/file/video''</font>")
+
     .URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/video''</font>")
 
  <FONT color=gray>' ''Imposta il controllo dell'uscita video da usare:''</font>
 
  <FONT color=gray>' ''Imposta il controllo dell'uscita video da usare:''</font>
     .SetWindow(da)  ' <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
+
     .SetWindow(da)  ' <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub MPlayer_Position()
 
    
 
    
 +
  Me.Title = "Durata del video: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) &
 +
            "  -  Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000))
 +
 
 +
End
 +
 +
Public Sub Button1_Click()
 +
 
  <FONT color=gray>' ''Esegue il file video:''</font>
 
  <FONT color=gray>' ''Esegue il file video:''</font>
 
   mp.Play()
 
   mp.Play()
 
 
  Repeat
 
<FONT color=gray>' ''Una brevissima pausa consente di mostrare e di agire sugli eventuali oggetti posti sul Form:''</font>
 
    Wait 0.01
 
    Me.Title = "Durata 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()
+
  End
 
+
 +
Public Sub Button2_Click()
 +
 
   mp.Stop
 
   mp.Stop
 
   mp.Close
 
   mp.Close
 
+
 
  '''End'''
+
  End
 +
 +
Public Sub ToggleButton1_Click()
 
   
 
   
'''Public''' Sub ToggleButton1_Click()
 
 
 
 
   If ToggleButton1.Value Then
 
   If ToggleButton1.Value Then
 
     mp.Pause
 
     mp.Pause
Riga 105: Riga 113:
 
     mp.Play
 
     mp.Play
 
   Endif
 
   Endif
 
+
 
  '''End'''
+
  End
 
====Eseguire il video in una finestra automaticamente aperta da ''Gstreamer''====
 
====Eseguire il video in una finestra automaticamente aperta da ''Gstreamer''====
 
Analogamente all'esecuzione in un'applicazione ''a riga di comando'' è possibile far mostrare il video in una finestra aperta in modo automatico da ''Gstreamer'' all'esterno del Form.
 
Analogamente all'esecuzione in un'applicazione ''a riga di comando'' è possibile far mostrare il video in una finestra aperta in modo automatico da ''Gstreamer'' all'esterno del Form.
Riga 112: Riga 120:
  
 
Anche questa finestra, volendo, può essere gestita mediante le Classi ''Desktop'' e ''DesktopWindow'' attivando i componenti ''gb.desktop'' e ''gb.desktop.x11''.
 
Anche questa finestra, volendo, può essere gestita mediante le Classi ''Desktop'' e ''DesktopWindow'' attivando i componenti ''gb.desktop'' e ''gb.desktop.x11''.
 
  
 
===Esecuzione di un video da un indirizzo web===
 
===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:
 
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
 
  With mp = New MediaPlayer
   <FONT Color=#B222222>.URL</font> = "https&#058;//www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm"
+
   <FONT Color=#B222222>.URL</font> = "https&#058;//gstreamer.freedesktop.org/media/sintel_cropped_multilingual.webm"
 +
  ......
  
  
=Eseguire un file video usando il plugin "Playbin" mediante le Classi ''MediaPipeline'' e ''MediaControl''=
+
=Eseguire un file video usando la Classe ''MediaPipeline'' e ''MediaControl''=
Mostriamo due esempi, nei quali il flusso audio-video sarà gestito dal plugin "playbin" richiamando le Classi ''MediaPipeline'' e ''MediaControl''.
+
Di seguito mostreremo l'uso della Classe ''MediaPipeline'' e ''MediaControl'' con il plugin "playbin" e con il plugin "decodebin".
 +
 
 +
==Uso del plugin "playbin"==
 +
Mostriamo due esempi, nei quali il flusso audio-video sarà gestito dal plugin "playbin" di GStreamer richiamando le Classi ''MediaPipeline'' e ''MediaControl''.
  
 
===Con applicazione a "riga di comando"===
 
===Con applicazione a "riga di comando"===
Riga 127: Riga 138:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
   Dim bin As MediaControl
+
   Dim pbn As MediaControl
 
   Dim filevideo As String
 
   Dim filevideo As String
 
    
 
    
   filevideo = Uri("<FONT Color=gray>''/percorso/del/file/video''</font>")
+
   filevideo = Uri("<FONT Color=darkgreen>''/percorso/del/file/video''</font>")
 
    
 
    
 
   pl = New MediaPipeline As "Pipe"
 
   pl = New MediaPipeline As "Pipe"
 
    
 
    
   bin = New MediaControl(pl, "playbin")
+
   pbn = New MediaControl(pl, "playbin")
   bin["uri"] = filevideo
+
   pbn["uri"] = filevideo
   bin["volume"] = 0.6    <FONT Color=gray>' ''Volume: da 0.00 a 1.0''</font>
+
   pbn["volume"] = 0.6    <FONT Color=gray>' ''Volume: da 0.00 a 1.0''</font>
 
    
 
    
 
   pl.Play  
 
   pl.Play  
Riga 154: Riga 165:
 
   Write "\n\e[0mEsecuzione terminata !"
 
   Write "\n\e[0mEsecuzione terminata !"
 
    
 
    
  '''End'''
+
  End
 
   
 
   
  '''Private''' Function Uri(s As String) As String
+
  Private Function Uri(s As String) As String
 
    
 
    
 
   Return "File:/" &/ s
 
   Return "File:/" &/ s
 
    
 
    
  '''End'''
+
  End
  
 
===Con applicazione grafica===
 
===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
 
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
 
  Private pl As MediaPipeline
 +
Private bo As Boolean
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
    
 
    
   Dim bin As MediaControl
+
   Dim pbn As MediaControl
 
   Dim filevideo As String
 
   Dim filevideo As String
 
    
 
    
   filevideo = Uri("<FONT Color=gray>''/percorso/del/file/video''</font>")
+
   filevideo = Uri("<FONT Color=darkgreen>''/percorso/del/file/video''</font>")
 
    
 
    
 
   pl = New MediaPipeline As "Pipe"
 
   pl = New MediaPipeline As "Pipe"
 
+
   bin = New MediaControl(pl, "playbin")
+
   pbn = New MediaControl(pl, "playbin")
   bin["uri"] = filevideo
+
   pbn["uri"] = filevideo
   bin["volume"] = 0.6    <FONT Color=gray>' ''Volume: da 0.00 a 1.0''</font>
+
   pbn["volume"] = 0.6    <FONT Color=gray>' ''Volume: da 0.00 a 1.0''</font>
 
+
 
  <FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font>
 
  <FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font>
   bin.SetWindow(DrawingArea1)
+
   pbn.SetWindow(DrawingArea1)
 
+
 
   pl.Play
 
   pl.Play
    
+
  Wait pl.Duration
+
   Repeat
    
+
    Wait 0.01
 +
   Until bo
 +
 
   pl.Stop
 
   pl.Stop
 
   pl.Close
 
   pl.Close
 
+
 
   Me.Text = "Esecuzione terminata !"
 
   Me.Text = "Esecuzione terminata !"
 
 
'''End'''
 
 
   
 
   
  '''Private''' Function Uri(s As String) As String
+
  End
 +
 +
Private Function Uri(s As String) As String
 
    
 
    
 
   Return "File:/" &/ s
 
   Return "File:/" &/ s
 
    
 
    
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Pipe_Position()
+
  Public Sub Pipe_Position()
 
    
 
    
 
   Me.Title = "Durata video: " & Str(Time(0, 0, 0, pl.Duration * 1000)) &
 
   Me.Title = "Durata video: " & Str(Time(0, 0, 0, pl.Duration * 1000)) &
 
             "  -  Tempo trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000))
 
             "  -  Tempo trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000))
 
    
 
    
  '''End'''
+
  End
 +
 +
Public Sub Pipe_End()
 +
 +
  bo = True
 +
 +
End
  
 
===Esecuzione di un video da un indirizzo web===
 
===Esecuzione di un video da un indirizzo web===
 
Va precisato che con il plug-in "playbin" alla sua Proprietà "<B>uri</b>" si passerà il percorso del file video, anticipato dal prefisso "File:/".
 
Va precisato che con il plug-in "playbin" alla sua Proprietà "<B>uri</b>" si passerà il percorso del file video, anticipato dal prefisso "File:/".
 
<BR>Se, invece, il video da eseguire ha un indirizzo web, allora alla predetta Proprietà "uri" va passato direttamente l'indirizzo web del video:
 
<BR>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")
+
  pbn = New MediaControl(pl, "playbin")
  bin["uri"] = "https&#058;//www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm"
+
  pbn["uri"] = "https&#058;//www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm"
 +
...
  
 +
==Uso del plugin "decodebin"==
 +
E' possibile eseguire un video mediante l'uso del plugin "decodebin" di GStreamer e delle Classi "MediaPipeline" and "MediaControl" del Componente gb.media.
  
=Eseguire un file video usando il plugin "Decodebin" mediante le Classi ''MediaPipeline'' e ''MediaControl''=
+
Mostriamo un esempio:
Per utilizzare il plugin "Decodebin" con un file video-audio, è necessario predisporre due "Pipeline" distinte: una per i dati video, l'altra per i dati audio.
+
Private pl As MediaPipeline
 +
Private bo As Boolean
 +
 +
 +
Public Sub Button1_Click()
 +
 +
  Dim src, vbin, vcon, vsnk, asrc, abin, acon, ares, asnk As MediaControl
 +
  Dim filevideo As String
 +
 +
  filevideo = "<FONT Color=darkgreen>''/percorso/del/file/video''</font>"
 +
 +
  pl = New MediaPipeline As "PLine"
 +
 
 +
  src = New MediaControl(pl, "filesrc")
 +
  src["location"] = filevideo
 +
   
 +
<FONT Color=gray>' ''Imposta i necessari MediaControl:''</font>
 +
  vbin = New MediaControl(pl, "decodebin")
 +
  vcon = New MediaControl(pl, "videoconvert")
 +
  vsnk = New MediaControl(pl, "xvimagesink")
 +
 +
  abin = New MediaControl(pl, "decodebin")
 +
  acon = New MediaControl(pl, "audioconvert")
 +
  ares = New MediaControl(pl, "audioresample")
 +
  asnk = New MediaControl(pl, "autoaudiosink")
 +
 +
<FONT Color=gray>' ''Connette i "MediaControl" precedentemente impostati:''</font>
 +
  src.LinkTo(vbin)
 +
  vbin.LinkLaterTo(vcon)
 +
  vcon.LinkTo(vsnk)
 +
 +
  asrc = New MediaControl(pl, "filesrc")
 +
  asrc["location"] = filevideo
 +
  asrc.LinkTo(abin)
 +
  abin.LinkLaterTo(acon)
 +
  acon.LinkTo(ares)
 +
  ares.LinkTo(asnk)
 +
 +
<FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font>
 +
  vsnk.SetWindow(DrawingArea1)
 +
 +
  pl.Play()
 +
 +
  While Not bo
 +
    Wait 0.01
 +
  Wend
 +
 +
  pl.Close
 +
 
 +
End
 +
 +
Public Sub PLine_Position()
 +
 +
<FONT Color=gray>' ''Mostra il tempo trascorso dall'avvio del video:''</font>
 +
  Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss")
 +
 +
End
 +
 +
Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando la conversione è terminata''</font>
 +
 +
  bo = True
 +
 +
End
 +
===Modificare la saturazione, la luminosità, la tonalità e il contrasto di un video===
 +
Per modificare la luminosità, il contrasto, la tonalità e la saturazione di un video, si userà l'elemento "videoBalance" di ''GStreamer'', gestendo le sue proprietà: ''brightness'', ''contrast'', ''hue'' e ''saturation''.
 +
<BR>I valori da assegnare sono in virgola mobile (più precisamente dei ''Float'') e hanno rispettivamente i seguenti ambiti di valori applicabili
 +
* "brightness" = da -1.0 a 1.0;
 +
* "contrast" = da 0.0 a 2.0;
 +
* "hue" = da -1.0 a 1.0;
 +
* "saturation" = da 0.0 a 2.0
  
Mostriamo un esempio in applicazione ''a riga di comando'':
+
Mostriamo un esempio pratico:
  '''Public''' Sub Main()
+
  Private pl As MediaPipeline
 +
Private bo As Boolean
 
   
 
   
  Dim pl1, pl2 As New MediaPipeline
+
   Dim src1, src2 As MediaControl
+
Public Sub Button1_Click()
  Dim bin, con, res, ask As MediaControl
+
   Dim bin2, vid, vsk As MediaControl
+
   Dim src, vbin, vcon, vbal, vsnk As MediaControl
 +
   Dim asrc, abin, acon, ares, asnk As MediaControl
 
   Dim filevideo As String
 
   Dim filevideo As String
  Dim d1, d2 As Date
 
 
   
 
   
   filevideo = "<FONT Color=gray>''/percorso/del/file/video''</font>"
+
   filevideo = "<FONT Color=darkgreen>''/percorso/del/filevideo''</font>"
 
   
 
   
  <FONT Color=gray>' ''Parte relativa alla decodifica audio:''</font>
+
  pl = New MediaPipeline As "PLine"
   src1 = New MediaControl(pl1, "filesrc")
+
 
   src1["location"] = filevideo
+
  src = New MediaControl(pl, "filesrc")
  bin = New MediaControl(pl1, "decodebin")
+
  src["location"] = filevideo
   con = New MediaControl(pl1, "audioconvert")
+
   
   res = New MediaControl(pl1, "audioresample")
+
  <FONT Color=gray>' ''Imposta i necessari MediaControl:''</font>
   ask = New MediaControl(pl1, "alsasink")
+
   vbin = New MediaControl(pl, "decodebin")
  src1.LinkTo(bin)
+
   vcon = New MediaControl(pl, "videoconvert")
 +
   vbal = New MediaControl(pl, "videobalance")
 +
<FONT Color=gray>' ''Imposta la luminosità del video (in questo caso lo scurisce):''</font>
 +
   vbal<FONT Color=red>["brightness"]= '''-0.4'''</font>
 +
   vsnk = New MediaControl(pl, "xvimagesink")
 
   
 
   
 +
  abin = New MediaControl(pl, "decodebin")
 +
  acon = New MediaControl(pl, "audioconvert")
 +
  ares = New MediaControl(pl, "audioresample")
 +
  asnk = New MediaControl(pl, "autoaudiosink")
 +
 +
<FONT Color=gray>' ''Connette i "MediaControl" precedentemente impostati:''</font>
 +
  src.LinkTo(vbin)
 +
  vbin.LinkLaterTo(vcon)
 +
  vcon.LinkTo(vbal)
 +
  vbal.LinkTo(vsnk)
 +
 +
  asrc = New MediaControl(pl, "filesrc")
 +
  asrc["location"] = filevideo
 +
  asrc.LinkTo(abin)
 +
  abin.LinkLaterTo(acon)
 +
  acon.LinkTo(ares)
 +
  ares.LinkTo(asnk)
 +
 +
<FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font>
 +
  vsnk.SetWindow(DrawingArea1)
 +
 +
  pl.Play()
 +
 +
  While Not bo
 +
    Wait 0.01
 +
  Wend
 +
 +
  pl.Close
 +
 
 +
End
 +
 +
Public Sub PLine_Position()
 +
 +
<FONT Color=gray>' ''Mostra il tempo trascorso dall'avvio del video:''</font>
 +
  Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss")
 +
 +
End
 +
 +
Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando la conversione è terminata''</font>
 +
 +
  bo = True
 +
 +
End
 +
 +
===Ruotare un video===
 +
E' possibile ruotare un video mediante l'uso del plugin "decodebin" di GStreamer e delle Classi "MediaPipeline" and "MediaControl" del Componente gb.media.
 +
 +
====Eseguire un video ruotato, nel quale non è possibile ascoltare l'eventuale audio====
 +
Mostriamo un esempio, precisando, però, che se il video contiene audio, questo non sarà ascoltabile.
 +
Private Enum none = 0, clockwise, rotate_180, counterclockwise, horizontal_flip,
 +
              vertical_flip, upper_left_diagonal, upper_right_diagonal, automatic
 +
Private pl As MediaPipeline
 +
Private bo As Boolean
 +
 +
 +
Public Sub Button1_Click()
 +
 +
  Dim src, bin, con, flp, snk As MediaControl
 +
 +
  pl = New MediaPipeline As "PLine"
 +
 
 +
  src = New MediaControl(pl, "filesrc")
 +
  src["location"] = "<FONT Color=darkgreen>''/percorso/del/filevideo''</font>"
 +
   
 +
<FONT Color=gray>' ''Imposta i necessari MediaControl:''</font>
 +
  bin = New MediaControl(pl, "decodebin")
 +
  con = New MediaControl(pl, "videoconvert")
 +
  flp = New MediaControl(pl, "videoflip")
 +
  flp["method"] = clockwise
 +
  snk = New MediaControl(pl, "xvimagesink")
 +
 +
<FONT Color=gray>' ''Connette i "MediaControl" precedentemente impostati:''</font>
 +
  src.LinkTo(bin)
 
   bin.LinkLaterTo(con)
 
   bin.LinkLaterTo(con)
   con.LinkTo(res)
+
   con.LinkTo(flp)
   res.LinkTo(ask)
+
   flp.LinkTo(snk)
 +
 +
<FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font>
 +
  snk.SetWindow(DrawingArea1)
 +
 +
  pl.Play()
 +
 +
  While Not bo
 +
    Wait 0.01
 +
  Wend
 +
 +
  pl.Close
 +
 
 +
End
 +
 +
Public Sub PLine_Position()
 +
 +
<FONT Color=gray>' ''Mostra il tempo trascorso dall'avvio del video:''</font>
 +
  Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss")
 
   
 
   
  <FONT Color=gray>' ''Parte relativa alla decodifica video:''</font>
+
  End
  src2 = New MediaControl(pl2, "filesrc")
 
  src2["location"] = filevideo
 
  bin2 = New MediaControl(pl2, "decodebin")
 
  vid = New MediaControl(pl2, "videoconvert")
 
  vsk = New MediaControl(pl2, "xvimagesink")
 
 
   
 
   
  src2.LinkTo(bin2)
+
Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando la conversione è terminata''</font>
  bin2.LinkLaterTo(vid)
 
  vid.LinkTo(vsk)
 
 
   
 
   
<FONT Color=gray>' ''Avvia entrambe le Pipeline:''</font>
+
  bo = True
  pl1.Play
 
  pl2.Play
 
 
   
 
   
  Repeat
+
End
    Wait 0.001
+
 
    d1 = Date(0, 0, 0, 0, 0, 0, pl2.pos * 1000)
+
====Eseguire un video ruotato, nel quale è possibile anche ascoltare l'eventuale audio====
    d2 = Date(0, 0, 0, 0, 0, 0, pl2.Duration * 1000)
+
Con quest'altro codice, se il video contiene anche l'audio, questo sarà udibile:
    Write "\rTempo trascorso: \e[31m" & Str(d1) & "\e[0m  -  Durata del video: " & Str(d2) &
+
  Private Enum none = 0, clockwise, rotate_180, counterclockwise, horizontal_flip,
          " -  Tempo rimanente: " & Str(Date(0, 0, 0, 0, 0, 0, DateDiff(d1, d2, gb.Millisecond)))
+
              vertical_flip, upper_left_diagonal, upper_right_diagonal, automatic
  Until Fix(pl2.Pos) >= Fix(pl2.Duration)
+
Private pl As MediaPipeline
 +
Private bo As Boolean
 
   
 
   
<FONT Color=gray>' ''Al termine dell'esecuzione del video, chiude entrambe le Pipeline:''</font>
 
  pl1.Close
 
  pl2.Close
 
 
   
 
   
  '''End'''
+
  Public Sub Button1_Click()
Di seguito il medesimo codice, ma in ambiente grafico. Il video verrà mostrato all'interno di una ''DrawingArea'' posta sul ''Form'' mediante il Metodo ".SetWindow" della Classe ''MediaControl'':
 
  '''Public''' Sub Button1_Click()
 
 
   
 
   
   Dim pl1, pl2 As New MediaPipeline
+
   Dim vsrc, vbin, vcon, vflp, vsnk, asrc, abin, acon, ares, asnk As MediaControl
  Dim src1, src2 As MediaControl
 
  Dim bin, con, res, ask As MediaControl
 
  Dim bin2, vid, vsk As MediaControl
 
 
   Dim filevideo As String
 
   Dim filevideo As String
  Dim d1, d2 As Date
 
 
   
 
   
   filevideo = "<FONT Color=gray>''/percorso/del/file/video''</font>"
+
   filevideo = "<FONT Color=darkgreen>''/percorso/del/filevideo''</font>"
 
   
 
   
<FONT Color=gray>' ''Parte relativa alla decodifica audio:''</font>
+
   pl = New MediaPipeline
  src1 = New MediaControl(pl1, "filesrc")
 
  src1["location"] = filevideo
 
  bin = New MediaControl(pl1, "decodebin")
 
  con = New MediaControl(pl1, "audioconvert")
 
  res = New MediaControl(pl1, "audioresample")
 
   ask = New MediaControl(pl1, "alsasink")
 
  src1.LinkTo(bin)
 
 
   
 
   
   bin.LinkLaterTo(con)
+
   vsrc = New MediaControl(pl, "filesrc")
   con.LinkTo(res)
+
  vsrc["location"] = filevideo
   res.LinkTo(ask)
+
 +
<FONT Color=gray>' ''Imposta i necessari MediaControl:''</font>
 +
  vbin = New MediaControl(pl, "decodebin")
 +
  vcon = New MediaControl(pl, "videoconvert")
 +
  vflp = New MediaControl(pl, "videoflip")
 +
  vflp["method"] = clockwise
 +
  vsnk = New MediaControl(pl, "xvimagesink")
 +
 +
  abin = New MediaControl(pl, "decodebin")
 +
  acon = New MediaControl(pl, "audioconvert")
 +
  ares = New MediaControl(pl, "audioresample")
 +
  asnk = New MediaControl(pl, "autoaudiosink")
 +
 +
<FONT Color=gray>' ''Connette i "MediaControl" precedentemente impostati:''</font>
 +
  vsrc.LinkTo(vbin)
 +
  vbin.LinkLaterTo(vcon)
 +
  vcon.LinkTo(vflp)
 +
  vflp.LinkTo(vsnk)
 +
 +
  asrc = New MediaControl(pl, "filesrc")
 +
  asrc["location"] = filevideo
 +
  asrc.LinkTo(abin)
 +
  abin.LinkLaterTo(acon)
 +
  acon.LinkTo(ares)
 +
  ares.LinkTo(asnk)
 +
 +
<FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font>
 +
  vsnk.SetWindow(DrawingArea1)
 +
 +
  pl.Play()
 +
 +
  While Not bo
 +
    Wait 0.01
 +
  Wend
 +
 +
  pl.Close
 +
 
 +
End
 +
 +
Public Sub PLine_Position()
 +
 +
<FONT Color=gray>' ''Mostra il tempo trascorso dall'avvio del video:''</font>
 +
  Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss")
 +
 +
End
 +
 +
Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando la conversione è terminata''</font>
 +
 +
  bo = True
 +
 +
End
 +
===Eseguire un video tagliato ai suoi bordi===
 +
Il video può essere mostrato con tagli d'immagine ai suoi bordi.
 +
<BR>Per ottenere questo effetto, si utilizzerà il plugin di ''Gstreamer'' "cropvideo", il quale ritaglia i fotogrammi video, cioè può rimuovere parti dell'immagine a sinistra, a destra, in alto o in basso e produrre un'immagine più piccola rispetto a quella di ingresso, con la rimozione delle parti indesiderate al bordo.
 +
<BR>Se il video contiene anche l'audio, questo sarà udibile.
 +
Private pl As MediaPipeline
 +
Private bo As Boolean
 +
 +
 +
Public Sub Button1_Click()
 +
 +
  Dim src, vbin, vcon, vcro, vsnk As MediaControl
 +
  Dim asrc, abin, acon, ares, asnk As MediaControl
 +
  Dim filevideo As String
 +
 +
  filevideo = "<FONT Color=darkgreen>''/percorso/del/filevideo''</font>"
 +
 +
  pl = New MediaPipeline As "PLine"
 +
 
 +
  src = New MediaControl(pl, "filesrc")
 +
   src["location"] = filevideo
 +
   
 +
<FONT Color=gray>' ''Imposta i necessari MediaControl:''</font>
 +
  vbin = New MediaControl(pl, "decodebin")
 +
  vcon = New MediaControl(pl, "videoconvert")
 +
  vcro = New MediaControl(pl, "videocrop")
 +
<FONT Color=gray>' ''Imposta la quantità di pixel dei lati del video da tagliare:''</font>
 +
  vcro["top"]= 100
 +
  vcro["left"] = 0
 +
  vcro["right"] = 300
 +
  vcro["bottom"] = 0
 +
  vsnk = New MediaControl(pl, "xvimagesink")
 +
 +
  abin = New MediaControl(pl, "decodebin")
 +
  acon = New MediaControl(pl, "audioconvert")
 +
  ares = New MediaControl(pl, "audioresample")
 +
  asnk = New MediaControl(pl, "autoaudiosink")
 +
 +
<FONT Color=gray>' ''Connette i "MediaControl" precedentemente impostati:''</font>
 +
  src.LinkTo(vbin)
 +
  vbin.LinkLaterTo(vcon)
 +
  vcon.LinkTo(vcro)
 +
  vcro.LinkTo(vsnk)
 +
 +
  asrc = New MediaControl(pl, "filesrc")
 +
  asrc["location"] = filevideo
 +
  asrc.LinkTo(abin)
 +
  abin.LinkLaterTo(acon)
 +
  acon.LinkTo(ares)
 +
   ares.LinkTo(asnk)
 +
 +
<FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font>
 +
  vsnk.SetWindow(DrawingArea1)
 +
 +
  pl.Play()
 +
 +
  While Not bo
 +
    Wait 0.01
 +
  Wend
 +
 +
  pl.Close
 +
 
 +
End
 
   
 
   
  <FONT Color=gray>' ''Parte relativa alla decodifica video:''</font>
+
  Public Sub PLine_Position()
  src2 = New MediaControl(pl2, "filesrc")
 
  src2["location"] = filevideo
 
  bin2 = New MediaControl(pl2, "decodebin")
 
  vid = New MediaControl(pl2, "videoconvert")
 
  vsk = New MediaControl(pl2, "xvimagesink")
 
  vsk<FONT Color=#B22222>.SetWindow</font>(DrawingArea1)
 
 
   
 
   
   src2.LinkTo(bin2)
+
<FONT Color=gray>' ''Mostra il tempo trascorso dall'avvio del video:''</font>
  bin2.LinkLaterTo(vid)
+
   Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss")
  vid.LinkTo(vsk)
 
 
   
 
   
  <FONT Color=gray>' ''Avvia entrambe le Pipeline:''</font>
+
  End
  pl1.Play
 
  pl2.Play
 
 
   
 
   
  Repeat
+
Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando la conversione è terminata''</font>
    Wait 0.001
 
    d1 = Date(0, 0, 0, 0, 0, 0, pl2.pos * 1000)
 
    d2 = Date(0, 0, 0, 0, 0, 0, pl2.Duration * 1000)
 
    Me.Title = "Tempo trascorso: " & Str(d1) & " - Durata: " & Str(d2) &
 
              "  -  Tempo rimanente: " & Str(Date(0, 0, 0, 0, 0, 0, DateDiff(d1, d2, gb.Millisecond)))
 
  Until Fix(pl2.Pos) >= Fix(pl2.Duration)
 
 
   
 
   
<FONT Color=gray>' ''Al termine dell'esecuzione del video, chiude entrambe le Pipeline:''</font>
+
  bo = True
  pl1.Close
 
  pl2.Close
 
 
   
 
   
  '''End'''
+
  End
  
  
  
 
=Note=
 
=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.
+
[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 abbia una vera finestra X11 (o Wayland), altrimenti si userà il primo controllo ''genitore'' con una finestra reale, che di solito è quella di primo livello.

Versione attuale delle 18:31, 9 gen 2024

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.

Assicurarsi che siano installati nel proprio sistema i seguenti plugin di GStreamer:

  • gstreamer1.0-plugins-good
  • gstreamer1.0-plugins-bad
  • gstreamer1.0-plugins-ugly
  • gst-libav

Eseguire un video con la Classe MediaPlayer

Mostreremo di seguito alcuni esempi per eseguire un file video mediante le risorse della Classe MediaPlayer.


Gli elementi essenziali per eseguire un file video con la Classe MediaPlayer sono:

  • la Proprietà ".Url" per caricare il file (se il file è memorizzato su dispositivo di memoria, allora il suo percorso andrà passato mediante il Metodo ".Url" della Classe statica "Media"; se il file è eseguito da un indirizzo web, allora sarà passato direttamente l'indirizzo web);
  • il Metodo ".Play()" per avviare l'esecuzione del file video;
  • la Proprietà ".Duration" per far eseguire il file video per l'intera sua durata;
  • il Metodo ".Close()" per chiudere il mediaplayer.

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 mp As MediaPlayer
Private bo As Boolean


Public Sub Main()
  
 With mp = New MediaPlayer As "MPlayer"
   .URL = Media.URL("/percorso/del/file/video")
   .Play()
   Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000)
   Repeat
     Wait 0.01
   Until bo
   .Stop
   .Close
 End With

' Avendo utilizzato l'Evento "Application_Read()", è necessario invocare l'istruzione "Quit" per terminare il programma:
 Quit

End

Public Sub MPlayer_Position()

' 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, mp.Position * 1000))
 Flush 

End

Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera, si arresta il programma

 bo = True
 
End

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 = 480
   .H = 320
 End With
  
 With mp = New MediaPlayer As "MPlayer"
   .URL = Media.URL("/percorso/del/file/video")
' Imposta il controllo dell'uscita video da usare:
   .SetWindow(da)  ' [nota 1]
 End With
  
End

Public Sub MPlayer_Position()
 
 Me.Title = "Durata del video: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) &
            "   -   Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000))
 
End

Public Sub Button1_Click()

' Esegue il file video:
 mp.Play()

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

Analogamente all'esecuzione in un'applicazione a riga di comando è possibile far mostrare il video in una finestra aperta in modo automatico da Gstreamer all'esterno del Form.
Per ottenere questo risultato in un'applicazione in ambiente grafico ovviamente non dovrà essere impostato alcuno specifico controllo GUI, ove reindirizzare l'uscita video.

Anche questa finestra, volendo, può essere gestita mediante le Classi Desktop e DesktopWindow attivando i componenti gb.desktop e gb.desktop.x11.

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://gstreamer.freedesktop.org/media/sintel_cropped_multilingual.webm"
  ......


Eseguire un file video usando la Classe MediaPipeline e MediaControl

Di seguito mostreremo l'uso della Classe MediaPipeline e MediaControl con il plugin "playbin" e con il plugin "decodebin".

Uso del plugin "playbin"

Mostriamo due esempi, nei quali il flusso audio-video sarà gestito dal plugin "playbin" di GStreamer richiamando le Classi MediaPipeline e MediaControl.

Con applicazione a "riga di comando"

Private pl As MediaPipeline


Public Sub Main()
 
 Dim pbn As MediaControl
 Dim filevideo As String
 
 filevideo = Uri("/percorso/del/file/video")
 
 pl = New MediaPipeline As "Pipe"
 
 pbn = New MediaControl(pl, "playbin")
 pbn["uri"] = filevideo
 pbn["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
Private bo As Boolean


Public Sub Button1_Click()
 
 Dim pbn As MediaControl
 Dim filevideo As String
 
 filevideo = Uri("/percorso/del/file/video")
 
 pl = New MediaPipeline As "Pipe"

 pbn = New MediaControl(pl, "playbin")
 pbn["uri"] = filevideo
 pbn["volume"] = 0.6     ' Volume: da 0.00 a 1.0

' Imposta la superficie grafica ove mostrare il video:
 pbn.SetWindow(DrawingArea1)

 pl.Play

 Repeat 
   Wait 0.01
 Until bo

 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.Title = "Durata video: " & Str(Time(0, 0, 0, pl.Duration * 1000)) &
            "   -   Tempo trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000))
 
End

Public Sub Pipe_End()

 bo = True

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:

pbn = New MediaControl(pl, "playbin")
pbn["uri"] = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm"
...

Uso del plugin "decodebin"

E' possibile eseguire un video mediante l'uso del plugin "decodebin" di GStreamer e delle Classi "MediaPipeline" and "MediaControl" del Componente gb.media.

Mostriamo un esempio:

Private pl As MediaPipeline
Private bo As Boolean


Public Sub Button1_Click()

 Dim src, vbin, vcon, vsnk, asrc, abin, acon, ares, asnk As MediaControl
 Dim filevideo As String

 filevideo = "/percorso/del/file/video"

 pl = New MediaPipeline As "PLine"
  
 src = New MediaControl(pl, "filesrc")
 src["location"] = filevideo
   
' Imposta i necessari MediaControl:
 vbin = New MediaControl(pl, "decodebin")
 vcon = New MediaControl(pl, "videoconvert")
 vsnk = New MediaControl(pl, "xvimagesink")

 abin = New MediaControl(pl, "decodebin")
 acon = New MediaControl(pl, "audioconvert")
 ares = New MediaControl(pl, "audioresample")
 asnk = New MediaControl(pl, "autoaudiosink")

' Connette i "MediaControl" precedentemente impostati:
 src.LinkTo(vbin)
 vbin.LinkLaterTo(vcon)
 vcon.LinkTo(vsnk)

 asrc = New MediaControl(pl, "filesrc")
 asrc["location"] = filevideo
 asrc.LinkTo(abin)
 abin.LinkLaterTo(acon)
 acon.LinkTo(ares)
 ares.LinkTo(asnk)

' Imposta la superficie grafica ove mostrare il video:
 vsnk.SetWindow(DrawingArea1)

 pl.Play()

 While Not bo 
   Wait 0.01
 Wend

 pl.Close
 
End

Public Sub PLine_Position()

' Mostra il tempo trascorso dall'avvio del video:
 Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss")

End

Public Sub PLine_End() ' Questo Evento viene sollevato, quando la conversione è terminata

 bo = True

End

Modificare la saturazione, la luminosità, la tonalità e il contrasto di un video

Per modificare la luminosità, il contrasto, la tonalità e la saturazione di un video, si userà l'elemento "videoBalance" di GStreamer, gestendo le sue proprietà: brightness, contrast, hue e saturation.
I valori da assegnare sono in virgola mobile (più precisamente dei Float) e hanno rispettivamente i seguenti ambiti di valori applicabili

  • "brightness" = da -1.0 a 1.0;
  • "contrast" = da 0.0 a 2.0;
  • "hue" = da -1.0 a 1.0;
  • "saturation" = da 0.0 a 2.0

Mostriamo un esempio pratico:

Private pl As MediaPipeline
Private bo As Boolean


Public Sub Button1_Click()

 Dim src, vbin, vcon, vbal, vsnk As MediaControl
 Dim asrc, abin, acon, ares, asnk As MediaControl
 Dim filevideo As String

 filevideo = "/percorso/del/filevideo"

 pl = New MediaPipeline As "PLine"
  
 src = New MediaControl(pl, "filesrc")
 src["location"] = filevideo
   
' Imposta i necessari MediaControl:
 vbin = New MediaControl(pl, "decodebin")
 vcon = New MediaControl(pl, "videoconvert")
 vbal = New MediaControl(pl, "videobalance")
' Imposta la luminosità del video (in questo caso lo scurisce):
 vbal["brightness"]= -0.4
 vsnk = New MediaControl(pl, "xvimagesink")

 abin = New MediaControl(pl, "decodebin")
 acon = New MediaControl(pl, "audioconvert")
 ares = New MediaControl(pl, "audioresample")
 asnk = New MediaControl(pl, "autoaudiosink")

' Connette i "MediaControl" precedentemente impostati:
 src.LinkTo(vbin)
 vbin.LinkLaterTo(vcon)
 vcon.LinkTo(vbal)
 vbal.LinkTo(vsnk)

 asrc = New MediaControl(pl, "filesrc")
 asrc["location"] = filevideo
 asrc.LinkTo(abin)
 abin.LinkLaterTo(acon)
 acon.LinkTo(ares)
 ares.LinkTo(asnk)

' Imposta la superficie grafica ove mostrare il video:
 vsnk.SetWindow(DrawingArea1)

 pl.Play()

 While Not bo 
   Wait 0.01
 Wend

 pl.Close
 
End

Public Sub PLine_Position()

' Mostra il tempo trascorso dall'avvio del video:
 Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss")

End

Public Sub PLine_End() ' Questo Evento viene sollevato, quando la conversione è terminata

 bo = True

End

Ruotare un video

E' possibile ruotare un video mediante l'uso del plugin "decodebin" di GStreamer e delle Classi "MediaPipeline" and "MediaControl" del Componente gb.media.

Eseguire un video ruotato, nel quale non è possibile ascoltare l'eventuale audio

Mostriamo un esempio, precisando, però, che se il video contiene audio, questo non sarà ascoltabile.

Private Enum none = 0, clockwise, rotate_180, counterclockwise, horizontal_flip,
             vertical_flip, upper_left_diagonal, upper_right_diagonal, automatic
Private pl As MediaPipeline
Private bo As Boolean


Public Sub Button1_Click()

 Dim src, bin, con, flp, snk As MediaControl

 pl = New MediaPipeline As "PLine"
  
 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/filevideo"
   
' Imposta i necessari MediaControl:
 bin = New MediaControl(pl, "decodebin")
 con = New MediaControl(pl, "videoconvert")
 flp = New MediaControl(pl, "videoflip")
 flp["method"] = clockwise
 snk = New MediaControl(pl, "xvimagesink")

' Connette i "MediaControl" precedentemente impostati:
 src.LinkTo(bin)
 bin.LinkLaterTo(con)
 con.LinkTo(flp)
 flp.LinkTo(snk)

' Imposta la superficie grafica ove mostrare il video:
 snk.SetWindow(DrawingArea1)

 pl.Play()

 While Not bo
   Wait 0.01
 Wend

 pl.Close
 
End

Public Sub PLine_Position()

' Mostra il tempo trascorso dall'avvio del video:
 Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss")

End

Public Sub PLine_End() ' Questo Evento viene sollevato, quando la conversione è terminata

 bo = True

End

Eseguire un video ruotato, nel quale è possibile anche ascoltare l'eventuale audio

Con quest'altro codice, se il video contiene anche l'audio, questo sarà udibile:

Private Enum none = 0, clockwise, rotate_180, counterclockwise, horizontal_flip,
             vertical_flip, upper_left_diagonal, upper_right_diagonal, automatic
Private pl As MediaPipeline
Private bo As Boolean


Public Sub Button1_Click()

 Dim vsrc, vbin, vcon, vflp, vsnk, asrc, abin, acon, ares, asnk As MediaControl
 Dim filevideo As String

 filevideo = "/percorso/del/filevideo"

 pl = New MediaPipeline

 vsrc = New MediaControl(pl, "filesrc")
 vsrc["location"] = filevideo

' Imposta i necessari MediaControl:
 vbin = New MediaControl(pl, "decodebin")
 vcon = New MediaControl(pl, "videoconvert")
 vflp = New MediaControl(pl, "videoflip")
 vflp["method"] = clockwise
 vsnk = New MediaControl(pl, "xvimagesink")

 abin = New MediaControl(pl, "decodebin")
 acon = New MediaControl(pl, "audioconvert")
 ares = New MediaControl(pl, "audioresample")
 asnk = New MediaControl(pl, "autoaudiosink")

' Connette i "MediaControl" precedentemente impostati:
 vsrc.LinkTo(vbin)
 vbin.LinkLaterTo(vcon)
 vcon.LinkTo(vflp)
 vflp.LinkTo(vsnk)

 asrc = New MediaControl(pl, "filesrc")
 asrc["location"] = filevideo
 asrc.LinkTo(abin)
 abin.LinkLaterTo(acon)
 acon.LinkTo(ares)
 ares.LinkTo(asnk)

' Imposta la superficie grafica ove mostrare il video:
 vsnk.SetWindow(DrawingArea1)

 pl.Play()

 While Not bo
   Wait 0.01
 Wend

 pl.Close
 
End

Public Sub PLine_Position()

' Mostra il tempo trascorso dall'avvio del video:
 Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss")

End

Public Sub PLine_End() ' Questo Evento viene sollevato, quando la conversione è terminata

 bo = True

End

Eseguire un video tagliato ai suoi bordi

Il video può essere mostrato con tagli d'immagine ai suoi bordi.
Per ottenere questo effetto, si utilizzerà il plugin di Gstreamer "cropvideo", il quale ritaglia i fotogrammi video, cioè può rimuovere parti dell'immagine a sinistra, a destra, in alto o in basso e produrre un'immagine più piccola rispetto a quella di ingresso, con la rimozione delle parti indesiderate al bordo.
Se il video contiene anche l'audio, questo sarà udibile.

Private pl As MediaPipeline
Private bo As Boolean


Public Sub Button1_Click()

 Dim src, vbin, vcon, vcro, vsnk As MediaControl
 Dim asrc, abin, acon, ares, asnk As MediaControl
 Dim filevideo As String

 filevideo = "/percorso/del/filevideo"

 pl = New MediaPipeline As "PLine"
  
 src = New MediaControl(pl, "filesrc")
 src["location"] = filevideo
   
' Imposta i necessari MediaControl:
 vbin = New MediaControl(pl, "decodebin")
 vcon = New MediaControl(pl, "videoconvert")
 vcro = New MediaControl(pl, "videocrop")
' Imposta la quantità di pixel dei lati del video da tagliare:
 vcro["top"]= 100
 vcro["left"] = 0
 vcro["right"] = 300
 vcro["bottom"] = 0
 vsnk = New MediaControl(pl, "xvimagesink")

 abin = New MediaControl(pl, "decodebin")
 acon = New MediaControl(pl, "audioconvert")
 ares = New MediaControl(pl, "audioresample")
 asnk = New MediaControl(pl, "autoaudiosink")

' Connette i "MediaControl" precedentemente impostati:
 src.LinkTo(vbin)
 vbin.LinkLaterTo(vcon)
 vcon.LinkTo(vcro)
 vcro.LinkTo(vsnk)

 asrc = New MediaControl(pl, "filesrc")
 asrc["location"] = filevideo
 asrc.LinkTo(abin)
 abin.LinkLaterTo(acon)
 acon.LinkTo(ares)
 ares.LinkTo(asnk)

' Imposta la superficie grafica ove mostrare il video:
 vsnk.SetWindow(DrawingArea1)

 pl.Play()

 While Not bo 
   Wait 0.01
 Wend

 pl.Close
 
End

Public Sub PLine_Position()

' Mostra il tempo trascorso dall'avvio del video:
 Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss")

End

Public Sub PLine_End() ' Questo Evento viene sollevato, quando la conversione è terminata

 bo = True

End


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 abbia una vera finestra X11 (o Wayland), altrimenti si userà il primo controllo genitore con una finestra reale, che di solito è quella di primo livello.