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

Da Gambas-it.org - Wikipedia.
 
(25 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Il componente '''gb.media''' offre la possibilità di sfruttare le funzionalità della piattaforma multimediale modulare ''GStreamer'' per la gestione di file video.
+
Il Componente '''gb.media''' offre la possibilità di sfruttare le funzionalità della piattaforma multimediale modulare ''GStreamer'' per la gestione di file video. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
  
 
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''.
+
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 di ''GStreamer''.
  
Assicurarsi che siano installati nel proprio sistema i seguenti plugin di GStreamer:
+
Assicurarsi che siano installati nel proprio sistema almeno i seguenti plugin di ''GStreamer'':
 
* gstreamer1.0-plugins-good
 
* gstreamer1.0-plugins-good
 
* gstreamer1.0-plugins-bad
 
* gstreamer1.0-plugins-bad
Riga 16: Riga 16:
  
 
Gli elementi essenziali per eseguire un file video con la Classe ''MediaPlayer'' sono:
 
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);
+
* 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 alla predetta proprietà sarà direttamente passato l'indirizzo web);
 
* il Metodo ".Play()" per avviare l'esecuzione del file video;
 
* il Metodo ".Play()" per avviare l'esecuzione del file video;
* la Proprietà ".Duration" per far eseguire il file video per l'intera sua durata;
+
* la Proprietà ".Duration" per conoscere la durata del video e per farlo eseguire per l'intera sua durata;
 +
* il Metodo ".Stop()" per arrestare eventualmente l'esecuzione del file video prima del suo termine naturale;
 
* 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 prima cliccando con il mouse all'interno della console/terminale e successivamente semplicemente premendo sul tasto "Invio" della tastiera:
 
  Private mp As MediaPlayer
 
  Private mp As MediaPlayer
 
  Private bo As Boolean
 
  Private bo As Boolean
Riga 46: Riga 46:
 
   
 
   
 
  End
 
  End
 +
 
   
 
   
 
  Public Sub MPlayer_Position()
 
  Public Sub MPlayer_Position()
Riga 54: Riga 55:
 
   
 
   
 
  End
 
  End
 +
 +
 +
Public Sub MPlayer_End()
 +
 +
  bo = True
 +
 +
End
 +
 
   
 
   
 
  Public Sub Application_Read() <FONT color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font>
 
  Public Sub Application_Read() <FONT color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font>
Riga 82: Riga 91:
 
     .URL = Media.URL("<FONT Color=darkgreen>''/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)  <FONT color=gray>'</font> <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
+
     .SetWindow(da)  <FONT color=gray>'</font> <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
 
   End With
 
   End With
 
    
 
    
 
  End
 
  End
 +
 
   
 
   
 
  Public Sub MPlayer_Position()
 
  Public Sub MPlayer_Position()
Riga 93: Riga 103:
 
    
 
    
 
  End
 
  End
 +
 
   
 
   
 
  Public Sub Button1_Click()
 
  Public Sub Button1_Click()
Riga 100: Riga 111:
 
   
 
   
 
  End
 
  End
 +
 
   
 
   
 
  Public Sub Button2_Click()
 
  Public Sub Button2_Click()
Riga 107: Riga 119:
 
    
 
    
 
  End
 
  End
 +
 
   
 
   
 
  Public Sub ToggleButton1_Click()
 
  Public Sub ToggleButton1_Click()
Riga 119: Riga 132:
  
 
====Modificare la dimensione del video con lo spostamento del mouse====
 
====Modificare la dimensione del video con lo spostamento del mouse====
In questo esempio, dopo aver cliccato su un punto del video, l'utente potrà modificare arbitrariamente la dimensione del video spostando il mouse e mentre si mantiene cliccato sul video. <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
+
In questo esempio, dopo aver cliccato su un punto del video, l'utente potrà modificare arbitrariamente la dimensione del video spostando il mouse e mentre si mantiene cliccato sul video. <SUP>&#091;[[#Note|nota 3]]&#093;</sup>
 
<BR>Come Controllo di base del video qui useremo una ''PictureBox''.
 
<BR>Come Controllo di base del video qui useremo una ''PictureBox''.
 
  Private PictureBox1 As PictureBox
 
  Private PictureBox1 As PictureBox
Riga 126: Riga 139:
 
   
 
   
 
  Public Sub Form_Open()
 
  Public Sub Form_Open()
 
  Dim sink As MediaControl
 
 
   
 
   
 
   PictureBox1 = New PictureBox(Me) As "PictureBox1"
 
   PictureBox1 = New PictureBox(Me) As "PictureBox1"
Riga 133: Riga 144:
 
   With mp = New MediaPlayer
 
   With mp = New MediaPlayer
 
     .URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/video''</font>")
 
     .URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/video''</font>")
  End With
 
 
  With sink = New MediaControl(mp, "xvimagesink")
 
 
     .SetWindow(PictureBox1)
 
     .SetWindow(PictureBox1)
 
   End With
 
   End With
 
   
 
   
   With mp
+
   <FONT Color=gray>' ''...oppure così:''
    .video.output = sink
+
  ' ''Dim sink As MediaControl
    .play
+
  ' ''With sink = New MediaControl(mp, "xvimagesink")''
  End With
+
  ' ''  .SetWindow(PictureBox1)''
 +
  ' ''End With''
 +
  ' ''mp.video.output = sink''</font>
 
   
 
   
 +
  mp.play
 +
 
 
   PictureBox1.Resize(mp.Video.Image.W, mp.Video.Image.H)
 
   PictureBox1.Resize(mp.Video.Image.W, mp.Video.Image.H)
 
   
 
   
Riga 168: Riga 180:
 
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;//gstreamer.freedesktop.org/media/sintel_cropped_multilingual.webm"
+
   <FONT Color=red>.URL</font> = "https&#058;//gstreamer.freedesktop.org/media/sintel_cropped_multilingual.webm"
 
   ......
 
   ......
Mostriamo un esempio pratico:
+
Mostriamo un esempio pratico.
 +
<BR>L'indirizzamento del video alla ''DrawingArea'' si realizzerà mediante il Metodo ".SetWindow()" della Classe ''MediaPlayer''.
 
  Private bo As Boolean
 
  Private bo As Boolean
 
   
 
   
 
   
 
   
  Public Sub Button1_Click()
+
  Public Sub ToggleButton1_Click()
 
   
 
   
 
   Dim mp As MediaPlayer
 
   Dim mp As MediaPlayer
  Dim snk As MediaControl
 
 
   
 
   
   mp = New MediaPlayer
+
   With mp = New MediaPlayer
  snk = New MediaControl(mp, "ximagesink")
 
 
  With mp
 
 
     .URL = "http&#058;//web.onair-radio.eu:1935/Alpha-Host/Alpha-Host/playlist.m3u8"
 
     .URL = "http&#058;//web.onair-radio.eu:1935/Alpha-Host/Alpha-Host/playlist.m3u8"
     .Video.Output = snk
+
     .SetWindow(DrawingArea1)
    snk.SetWindow(DrawingArea1)
 
 
     .Play
 
     .Play
 
   End With
 
   End With
 +
 +
  <FONT Color=gray>' ''...oppure così:''
 +
  ' ''Dim snk As MediaControl''
 +
  ' ''snk = New MediaControl(mp, "'''ximagesink'''")''
 +
  ' ''With mp ''
 +
  ' ''  .URL = "http&#058;//web.onair-radio.eu:1935/Alpha-Host/Alpha-Host/playlist.m3u8"''
 +
  ' ''  snk.SetWindow(DrawingArea1)''
 +
  ' ''  .Video.Output = snk''
 +
  ' ''  .Play
 +
  ' ''End With''</font>
 
   
 
   
 
   Repeat
 
   Repeat
 
     Write "\rTempo trascorso: " & Str(Time(0, 0, 0, mp.Position * 1000))
 
     Write "\rTempo trascorso: " & Str(Time(0, 0, 0, mp.Position * 1000))
 
     Wait 0.01
 
     Wait 0.01
   Until bo = True
+
   Until ToggleButton1.Value = False
 
   
 
   
 
   mp.Stop
 
   mp.Stop
 
   mp.Close
 
   mp.Close
 +
 +
End
 +
Un altro esempio pratico, ma in applicazione ''a riga di comando'':
 +
Private mp As MediaPlayer
 +
Private bo As Boolean
 +
 +
 +
Public Sub Main()
 +
 
 +
  With mp = New MediaPlayer As "MPlayer"
 +
    .URL = "https&#058;//d15umi5iaezxgx.cloudfront.net/LA7/CLN/HLS-B/Live.m3u8"
 +
    .Play()
 +
    Repeat
 +
      Wait 0.01
 +
    Until bo
 +
    .Stop
 +
    .Close
 +
  End With
 +
 +
<FONT Color=gray>' ''Avendo utilizzato l'Evento "Application_Read()", è necessario invocare l'istruzione "Quit" per terminare il programma:''</font>
 
   Quit
 
   Quit
 
   
 
   
Riga 201: Riga 239:
 
   
 
   
 
   
 
   
  Public Sub Application_Read()
+
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
Riga 316: Riga 363:
 
<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:
 
  pbn = New MediaControl(pl, "playbin")
 
  pbn = New MediaControl(pl, "playbin")
  pbn["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" <FONT Color=gray>'</font> <SUP>&#091;[[#Note|nota 4]]&#093;</sup>
 
  ...
 
  ...
  
Riga 330: Riga 377:
 
   Dim uri As String
 
   Dim uri As String
 
   
 
   
   uri = "http&#058;//web.onair-radio.eu:1935/Alpha-Host/Alpha-Host/playlist.m3u8"
+
   uri = "http&#058;//devimages.apple.com/iphone/samples/bipbop/gear4/prog_index.m3u8"
 
   
 
   
 
   pl = New MediaPipeline As "PLine"
 
   pl = New MediaPipeline As "PLine"
Riga 338: Riga 385:
 
   vbin["uri"] = uri
 
   vbin["uri"] = uri
 
   vcon = New MediaControl(pl, "videoconvert")
 
   vcon = New MediaControl(pl, "videoconvert")
   vsnk = New MediaControl(pl, "ximagesink")
+
   vsnk = New MediaControl(pl, "<FONT Color=red>ximagesink</font>")
 
   
 
   
 
   vbin.LinkLaterTo(vcon)
 
   vbin.LinkLaterTo(vcon)
Riga 386: Riga 433:
 
E' possibile eseguire un video mediante l'uso del plugin "decodebin" di GStreamer e delle Classi "MediaPipeline" and "MediaControl" del Componente gb.media.
 
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:
+
Mostriamo un esempio con un'applicazione in ambiente grafico:
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
 
  Private bo As Boolean
 
  Private bo As Boolean
Riga 393: Riga 440:
 
  Public Sub Button1_Click()
 
  Public Sub Button1_Click()
 
   
 
   
   Dim src, vbin, vcon, vsnk, asrc, abin, acon, ares, asnk As MediaControl
+
   Dim vfs, vbin, vcon, vsnk As MediaControl
 +
  Dim afs, abin, acon, ares, asnk As MediaControl
 
   Dim filevideo As String
 
   Dim filevideo As String
 
   
 
   
Riga 403: Riga 451:
 
   src["location"] = filevideo
 
   src["location"] = filevideo
 
      
 
      
  <FONT Color=gray>' ''Imposta i necessari MediaControl:''</font>
+
  <FONT Color=gray>' ''Parte video:''</font>
 +
  vfs = New MediaControl(pl, "filesrc")
 +
  vfs["location"] = filevideo
 
   vbin = New MediaControl(pl, "decodebin")
 
   vbin = New MediaControl(pl, "decodebin")
 
   vcon = New MediaControl(pl, "videoconvert")
 
   vcon = New MediaControl(pl, "videoconvert")
 
   vsnk = New MediaControl(pl, "xvimagesink")
 
   vsnk = New MediaControl(pl, "xvimagesink")
 
   
 
   
 +
  vfs.LinkTo(vbin)
 +
  vbin.LinkLaterTo(vcon)
 +
  vcon.LinkTo(vsnk)
 +
 +
<FONT Color=gray>' ''Parte audio:''</font>
 +
  afs = New MediaControl(pl, "filesrc")
 +
  afs["location"] = filevideo
 
   abin = New MediaControl(pl, "decodebin")
 
   abin = New MediaControl(pl, "decodebin")
 
   acon = New MediaControl(pl, "audioconvert")
 
   acon = New MediaControl(pl, "audioconvert")
Riga 413: Riga 470:
 
   asnk = New MediaControl(pl, "autoaudiosink")
 
   asnk = New MediaControl(pl, "autoaudiosink")
 
   
 
   
<FONT Color=gray>' ''Connette i "MediaControl" precedentemente impostati:''</font>
+
   afs.LinkTo(abin)
   src.LinkTo(vbin)
 
  vbin.LinkLaterTo(vcon)
 
  vcon.LinkTo(vsnk)
 
 
  asrc = New MediaControl(pl, "filesrc")
 
  asrc["location"] = filevideo
 
  asrc.LinkTo(abin)
 
 
   abin.LinkLaterTo(acon)
 
   abin.LinkLaterTo(acon)
 
   acon.LinkTo(ares)
 
   acon.LinkTo(ares)
Riga 446: Riga 496:
 
   
 
   
 
  Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando l'esecuzione è terminata''</font>
 
  Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando l'esecuzione è terminata''</font>
 +
 +
  bo = True
 +
 +
End
 +
...e con applicazione ''a riga di comando'':
 +
Privare Const FILEVIDEO As String = "<FONT Color=darkgreen>''/percorso/del/file/video''</font>"
 +
Private bo As Boolean
 +
 +
 +
Public Sub Main()
 +
 +
  Dim pl As MediaPipeline
 +
  Dim vfs, dc1, vcn, vsnk As MediaControl
 +
  Dim afs, dc2, acn, ares, asnk As MediaControl
 +
  Dim filevideo As String
 +
 +
  pl = New MediaPipeline As "MPipe"
 +
 +
<FONT Color=gray>' ''Parte video:''</font>
 +
  vfs = New MediaControl(pl, "filesrc")
 +
  vfs["location"] = FILEVIDEO
 +
  dc1 = New MediaControl(pl, "decodebin")
 +
  vcn = New MediaControl(pl, "videoconvert")
 +
  vsnk = New MediaControl(pl, "ximagesink")
 +
 +
  vfs.LinkTo(dc1)
 +
  dc1.LinkLaterTo(vcn)
 +
  vcn.LinkTo(vsnk)
 +
 +
<FONT Color=gray>' ''Parte audio:''</font>
 +
  afs = New MediaControl(pl, "filesrc")
 +
  afs["location"] = FILEVIDEO
 +
  dc2 = New MediaControl(pl, "decodebin")
 +
  acn = New MediaControl(pl, "audioconvert")
 +
  ares = New MediaControl(pl, "audioresample")
 +
  asnk = New MediaControl(pl, "autoaudiosink")
 +
 +
  afs.LinkTo(dc2)
 +
  dc2.LinkLaterTo(acn)
 +
  acn.LinkTo(ares)
 +
  ares.LinkTo(asnk)
 +
 +
  pl.Play
 +
 +
  While Not bo
 +
    Wait 0.01
 +
  Wend
 +
 +
  pl.Close
 +
 +
End
 +
 +
 +
Public Sub MPipe_End()  <FONT Color=gray>' ''Questo Evento viene sollevato, quando l'esecuzione è terminata''</font>
 
   
 
   
 
   bo = True
 
   bo = True
Riga 805: Riga 909:
 
   
 
   
 
  End
 
  End
 +
 +
 +
==Uso del plugin "souphttpsrc"==
 +
Un flusso video da web può essere gestito anche con il plugin "souphttpsrc" di GStreamer con le Classi ''MediaPipeline'' e ''MediaControl'' del Componente ''gb.media''.
 +
<BR> Utilizzeremo anche il plugin "uridecodebin" per far udire l'audio.
 +
 +
Mostriamo un esempio pratico:
 +
Private pl As MediaPipeline
 +
Private bo As Boolean
 +
 +
 +
Public Sub Main()
 +
 +
  Dim stp, hls, tsd, h264, avd, vcon, vsnk As MediaControl
 +
  Dim abin, acon, ares, asnk As MediaControl
 +
  Dim flt As MediaFilter
 +
  Dim uri As String
 +
 +
  uri = "https&#058;//d15umi5iaezxgx.cloudfront.net/LA7/CLN/HLS-B/Live.m3u8"
 +
 +
  pl = New MediaPipeline As "PLine"
 +
 +
<FONT Color=gray>' ''Imposta i necessari MediaControl per la parte video:''</font>
 +
  stp = New MediaControl(pl, "souphttpsrc")
 +
  stp["location"] = uri
 +
  hls = New MediaControl(pl, "hlsdemux")
 +
  tsd = New MediaControl(pl, "tsdemux")
 +
  flt = New MediaFilter(pl, "video/x-h264")
 +
  h264 = New MediaControl(pl, "h264parse")
 +
  avd = New MediaControl(pl, "avdec_h264")
 +
  vcon = New MediaControl(pl, "videoconvert")
 +
  vsnk = New MediaControl(pl, "ximagesink")
 +
 +
  stp.LinkTo(hls)
 +
  hls.LinkLaterTo(tsd)
 +
  tsd.LinkLaterTo(flt)
 +
  flt.LinkTo(h264)
 +
  h264.LinkTo(avd)
 +
  avd.LinkTo(vcon)
 +
  vcon.LinkTo(vsnk)
 +
 +
<FONT Color=gray>' ''Imposta i necessari MediaControl per la parte audio:''</font>
 +
  abin = New MediaControl(pl, "uridecodebin")
 +
  abin["uri"] = uri
 +
  acon = New MediaControl(pl, "audioconvert")
 +
  ares = New MediaControl(pl, "audioresample")
 +
  asnk = New MediaControl(pl, "autoaudiosink")
 +
 +
  abin.LinkLaterTo(acon)
 +
  acon.LinkTo(ares)
 +
  ares.LinkTo(asnk)
 +
 +
  pl.Play()
 +
 +
  While Not bo
 +
    Wait 0.01
 +
  Wend
 +
 +
  pl.Close
 +
<FONT Color=gray>' ''Avendo usto l'Evento "Application_Read(), si dovrà usre l'istruzione "Quit" per terminare l'applicazione:''</font>
 +
  Quit
 +
 +
End
 +
 +
 +
Public Sub Application_Read()
 +
 +
  bo = True
 +
 +
End
 +
 +
 +
==Eseguire un file video alterandone il momento della partenza==
 +
Se si intende far partire un file video in ritardo o in anticipo, basterà assegnare un valore in ''nanosecondi'' alla Proprietà "ts-offset" dell'elemento finale "sink": un valore negativo anticipa l'inizio dell'esecuzione del video, mentre un valore positivo la posticipa.
 +
snk = New MediaControl(pl, "autoaudiosink")
 +
snk["ts-offset"] = 5000000000 <FONT Color=gray>' ''Ritarda la partenza dell'esecuzione del file MIDI di 5 secondi''</font>
  
  
  
 
=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 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.
+
[1] Vedere anche questa pagina: https://github.com/DamZiobro/gstreamerCheatsheet/blob/master/README.md#play-hls-http-live-streaming-url-using-gstreamer-pipeline
 +
 
 +
[2] 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.
 +
 
 +
[3] Vedere anche il seguente paragrafo: [https://www.gambas-it.org/wiki/index.php/Effettuare_una_ripresa_video_mediante_una_WebCam_con_il_Componente_gb.media#Modificare_la_dimensione_del_video_agendo_su_uno_Slider Modificare la dimensione del video agendo su uno Slider]
  
[2] Vedere anche il seguente paragrafo: [https://www.gambas-it.org/wiki/index.php/Effettuare_una_ripresa_video_mediante_una_WebCam_con_il_Componente_gb.media#Modificare_la_dimensione_del_video_agendo_su_uno_Slider Modificare la dimensione del video agendo su uno Slider]
+
[4] Qui un elenco di indirizzi di web-TV: https://database.freetuxtv.net/

Versione attuale delle 15:13, 7 ago 2024

Il Componente gb.media offre la possibilità di sfruttare le funzionalità della piattaforma multimediale modulare GStreamer per la gestione di file video. [nota 1]

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 di GStreamer.

Assicurarsi che siano installati nel proprio sistema almeno 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 alla predetta proprietà sarà direttamente passato l'indirizzo web);
  • il Metodo ".Play()" per avviare l'esecuzione del file video;
  • la Proprietà ".Duration" per conoscere la durata del video e per farlo eseguire per l'intera sua durata;
  • il Metodo ".Stop()" per arrestare eventualmente l'esecuzione del file video prima del suo termine naturale;
  • 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 prima cliccando con il mouse all'interno della console/terminale e successivamente semplicemente premendo sul tasto "Invio" della tastiera:

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 MPlayer_End()

 bo = True

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 2]
 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

Modificare la dimensione del video con lo spostamento del mouse

In questo esempio, dopo aver cliccato su un punto del video, l'utente potrà modificare arbitrariamente la dimensione del video spostando il mouse e mentre si mantiene cliccato sul video. [nota 3]
Come Controllo di base del video qui useremo una PictureBox.

Private PictureBox1 As PictureBox
Private mp As MediaPlayer


Public Sub Form_Open()

  PictureBox1 = New PictureBox(Me) As "PictureBox1"

  With mp = New MediaPlayer
    .URL = Media.URL("/percorso/del/file/video")
    .SetWindow(PictureBox1)
  End With

  ' ...oppure così:
  ' Dim sink As MediaControl
  ' With sink = New MediaControl(mp, "xvimagesink")
  '   .SetWindow(PictureBox1)
  ' End With
  ' mp.video.output = sink

  mp.play
 
  PictureBox1.Resize(mp.Video.Image.W, mp.Video.Image.H)

End


Public Sub PictureBox1_MouseMove()

  With PictureBox1
    .Image = mp.Video.Image.Stretch(Mouse.X + 1, Mouse.Y + 1)
    .Resize(PictureBox1.Image.W, PictureBox1.Image.H)
  End With

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"
  ......

Mostriamo un esempio pratico.
L'indirizzamento del video alla DrawingArea si realizzerà mediante il Metodo ".SetWindow()" della Classe MediaPlayer.

Private bo As Boolean


Public Sub ToggleButton1_Click()

 Dim mp As MediaPlayer

 With mp = New MediaPlayer
   .URL = "http://web.onair-radio.eu:1935/Alpha-Host/Alpha-Host/playlist.m3u8"
   .SetWindow(DrawingArea1)
   .Play
 End With

 ' ...oppure così:
 ' Dim snk As MediaControl
 ' snk = New MediaControl(mp, "ximagesink")
 ' With mp 
 '   .URL = "http://web.onair-radio.eu:1935/Alpha-Host/Alpha-Host/playlist.m3u8"
 '   snk.SetWindow(DrawingArea1)
 '   .Video.Output = snk
 '   .Play
 ' End With

 Repeat
   Write "\rTempo trascorso: " & Str(Time(0, 0, 0, mp.Position * 1000))
   Wait 0.01
 Until ToggleButton1.Value = False

 mp.Stop
 mp.Close

End

Un altro esempio pratico, ma in applicazione a riga di comando:

Private mp As MediaPlayer
Private bo As Boolean


Public Sub Main()
 
 With mp = New MediaPlayer As "MPlayer"
   .URL = "https://d15umi5iaezxgx.cloudfront.net/LA7/CLN/HLS-B/Live.m3u8"
   .Play()
   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 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

Uso del plugin "playbin"

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" ' [nota 4]
...

Uso del plugin "uridecodebin"

Mostriamo un esempio pratico in ambiente grafico:

Private pl As MediaPipeline
Private bo As Boolean


Public Sub Button1_Click()

 Dim vbin, vcon, vsnk, abin, acon, ares, asnk As MediaControl
 Dim uri As String

 uri = "http://devimages.apple.com/iphone/samples/bipbop/gear4/prog_index.m3u8"

 pl = New MediaPipeline As "PLine"
  
' Imposta i necessari MediaControl per la parte video:
 vbin = New MediaControl(pl, "uridecodebin")
 vbin["uri"] = uri
 vcon = New MediaControl(pl, "videoconvert")
 vsnk = New MediaControl(pl, "ximagesink")

 vbin.LinkLaterTo(vcon)
 vcon.LinkTo(vsnk)

' Imposta i necessari MediaControl per la parte audio:
 abin = New MediaControl(pl, "uridecodebin")
 abin["uri"] = uri
 acon = New MediaControl(pl, "audioconvert")
 ares = New MediaControl(pl, "audioresample")
 asnk = New MediaControl(pl, "autoaudiosink")

 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 l'esecuzione è terminata

 bo = True

End


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 con un'applicazione in ambiente grafico:

Private pl As MediaPipeline
Private bo As Boolean


Public Sub Button1_Click()

 Dim vfs, vbin, vcon, vsnk As MediaControl
 Dim afs, 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
   
' Parte video:
 vfs = New MediaControl(pl, "filesrc")
 vfs["location"] = filevideo
 vbin = New MediaControl(pl, "decodebin")
 vcon = New MediaControl(pl, "videoconvert")
 vsnk = New MediaControl(pl, "xvimagesink")

 vfs.LinkTo(vbin)
 vbin.LinkLaterTo(vcon)
 vcon.LinkTo(vsnk)

' Parte audio:
 afs = New MediaControl(pl, "filesrc")
 afs["location"] = filevideo
 abin = New MediaControl(pl, "decodebin")
 acon = New MediaControl(pl, "audioconvert")
 ares = New MediaControl(pl, "audioresample")
 asnk = New MediaControl(pl, "autoaudiosink")

 afs.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 l'esecuzione è terminata

 bo = True

End

...e con applicazione a riga di comando:

Privare Const FILEVIDEO As String = "/percorso/del/file/video"
Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim vfs, dc1, vcn, vsnk As MediaControl
 Dim afs, dc2, acn, ares, asnk As MediaControl
 Dim filevideo As String

 pl = New MediaPipeline As "MPipe"

' Parte video:
 vfs = New MediaControl(pl, "filesrc")
 vfs["location"] = FILEVIDEO
 dc1 = New MediaControl(pl, "decodebin")
 vcn = New MediaControl(pl, "videoconvert")
 vsnk = New MediaControl(pl, "ximagesink")

 vfs.LinkTo(dc1)
 dc1.LinkLaterTo(vcn)
 vcn.LinkTo(vsnk)

' Parte audio:
 afs = New MediaControl(pl, "filesrc")
 afs["location"] = FILEVIDEO
 dc2 = New MediaControl(pl, "decodebin")
 acn = New MediaControl(pl, "audioconvert")
 ares = New MediaControl(pl, "audioresample")
 asnk = New MediaControl(pl, "autoaudiosink")

 afs.LinkTo(dc2)
 dc2.LinkLaterTo(acn)
 acn.LinkTo(ares)
 ares.LinkTo(asnk)

 pl.Play

 While Not bo
   Wait 0.01
 Wend

 pl.Close

End


Public Sub MPipe_End()   ' Questo Evento viene sollevato, quando l'esecuzione è 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


Modificare il momento della partenza dell'audio o del video

Se, eseguendo un file audio-video, si intende modificare l'inizio dell'esecusione del video o dell'audio (o di entrambi), è possibile aggiungere all'elemento finale "sink" la sua proprietà "ts-offset" asegnando ad essa un valore in nanosecondi.
Così ad esempio, se si vuole fa partire l'esecuzione del video con un ritardo di 5 secondi:

vsnk = New MediaControl(pl, "xvimagesink")
vsnk["ts-offset"] = 5000000000

Con un file audio-video in questo caso il video sarà mostrato con un ritardo di 5 secondi dopo la partenza dell'audio.


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


Eseguire i video visualizzandoli in ascii art

Usando il plugin "aatv" di GStreamer, i video saranno mostrati in ascii art.

Mostriamo un semplice esempio con applicazione a riga di comando:

Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, dcb, aa, con, snk As MediaControl
 Dim asrc, abin, acon, ares, asnk As MediaControl
 Dim filevideo As String
 Dim tm As Date
 
 filevideo = "/percorso/del/file/video"

 pl = New MediaPipeline

' Parte video-grafica:
 src = New MediaControl(pl, "filesrc")
 src["location"] = filevideo
 dcb = New MediaControl(pl, "decodebin")
 aa = New MediaControl(pl, "aatv")
 con = New MediaControl(pl, "videoconvert")
 snk = New MediaControl(pl, "autovideosink")

 src.LinkTo(dcb)
 dcb.LinkLaterTo(aa)
 aa.LinkTo(con)
 con.LinkTo(snk)

' Parte audio:
 asrc = New MediaControl(pl, "filesrc")
 asrc["location"] = filevideo
 abin = New MediaControl(pl, "decodebin")
 acon = New MediaControl(pl, "audioconvert")
 ares = New MediaControl(pl, "audioresample")
 asnk = New MediaControl(pl, "autoaudiosink")

 asrc.LinkTo(abin)
 abin.LinkLaterTo(acon)
 acon.LinkTo(ares)
 ares.LinkTo(asnk)

 pl.Play

 Repeat ' Finché la durata del video non viene rilevata, il ciclo continua
   Wait 0.01
 Until pl.Duration > 0.00
 Print "Durata del video: "; Time(0, 0, 0, pl.Duration * 1000)
 tm = Now
 Repeat 
   Write "\r\e[0mTempo trascorso:  \e[31m" & Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)))
   Wait 0.01
 Until DateDiff(tm, Now, gb.Millisecond) >= (pl.Duration * 1000)

 pl.Stop
 pl.Close

End


Uso del plugin "souphttpsrc"

Un flusso video da web può essere gestito anche con il plugin "souphttpsrc" di GStreamer con le Classi MediaPipeline e MediaControl del Componente gb.media.
Utilizzeremo anche il plugin "uridecodebin" per far udire l'audio.

Mostriamo un esempio pratico:

Private pl As MediaPipeline
Private bo As Boolean


Public Sub Main()

 Dim stp, hls, tsd, h264, avd, vcon, vsnk As MediaControl
 Dim abin, acon, ares, asnk As MediaControl
 Dim flt As MediaFilter
 Dim uri As String

 uri = "https://d15umi5iaezxgx.cloudfront.net/LA7/CLN/HLS-B/Live.m3u8"

 pl = New MediaPipeline As "PLine"

' Imposta i necessari MediaControl per la parte video:
 stp = New MediaControl(pl, "souphttpsrc")
 stp["location"] = uri
 hls = New MediaControl(pl, "hlsdemux")
 tsd = New MediaControl(pl, "tsdemux")
 flt = New MediaFilter(pl, "video/x-h264")
 h264 = New MediaControl(pl, "h264parse")
 avd = New MediaControl(pl, "avdec_h264")
 vcon = New MediaControl(pl, "videoconvert")
 vsnk = New MediaControl(pl, "ximagesink")

 stp.LinkTo(hls)
 hls.LinkLaterTo(tsd)
 tsd.LinkLaterTo(flt)
 flt.LinkTo(h264)
 h264.LinkTo(avd)
 avd.LinkTo(vcon)
 vcon.LinkTo(vsnk)

' Imposta i necessari MediaControl per la parte audio:
 abin = New MediaControl(pl, "uridecodebin")
 abin["uri"] = uri
 acon = New MediaControl(pl, "audioconvert")
 ares = New MediaControl(pl, "audioresample")
 asnk = New MediaControl(pl, "autoaudiosink")

 abin.LinkLaterTo(acon)
 acon.LinkTo(ares)
 ares.LinkTo(asnk)

 pl.Play()

 While Not bo 
   Wait 0.01
 Wend

 pl.Close
' Avendo usto l'Evento "Application_Read(), si dovrà usre l'istruzione "Quit" per terminare l'applicazione:
 Quit

End


Public Sub Application_Read()

 bo = True

End


Eseguire un file video alterandone il momento della partenza

Se si intende far partire un file video in ritardo o in anticipo, basterà assegnare un valore in nanosecondi alla Proprietà "ts-offset" dell'elemento finale "sink": un valore negativo anticipa l'inizio dell'esecuzione del video, mentre un valore positivo la posticipa.

snk = New MediaControl(pl, "autoaudiosink")
snk["ts-offset"] = 5000000000 ' Ritarda la partenza dell'esecuzione del file MIDI di 5 secondi


Note

[1] Vedere anche questa pagina: https://github.com/DamZiobro/gstreamerCheatsheet/blob/master/README.md#play-hls-http-live-streaming-url-using-gstreamer-pipeline

[2] 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.

[3] Vedere anche il seguente paragrafo: Modificare la dimensione del video agendo su uno Slider

[4] Qui un elenco di indirizzi di web-TV: https://database.freetuxtv.net/