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

Da Gambas-it.org - Wikipedia.
Riga 120: Riga 120:
  
  
=Eseguire un file video usando il plugin "Playbin" mediante la Classe ''MediaPipeline''=
+
=Eseguire un file video usando il plugin "Playbin" mediante le Classi ''MediaPipeline'' e ''MediaControl''=
 
Mostriamo due esempi, nei quali il flusso audio-video sarà gestito dal plugin "playbin" richiamando le Classi ''MediaPipeline'' e ''MediaControl''.
 
Mostriamo due esempi, nei quali il flusso audio-video sarà gestito dal plugin "playbin" richiamando le Classi ''MediaPipeline'' e ''MediaControl''.
  
Riga 212: Riga 212:
 
  bin = New MediaControl(pl, "playbin")
 
  bin = New MediaControl(pl, "playbin")
 
  bin["uri"] = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm"
 
  bin["uri"] = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm"
 +
 +
 +
=Eseguire un file video usando il plugin "Decodebin" mediante le Classi ''MediaPipeline'' e ''MediaControl''=
 +
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.
 +
 +
Mostriamo un esempio in applicazione ''a riga di comando'':
 +
'''Public''' Sub Main()
 +
 +
  Dim pl1, pl2 As New MediaPipeline
 +
  Dim src1, src2 As MediaControl
 +
  Dim bin, con, res, ask As MediaControl
 +
  Dim bin2, vid, vsk As MediaControl
 +
  Dim filevideo As String
 +
  Dim d1, d2 As Date
 +
 +
  filevideo = "<FONT Color=gray>''/percorso/del/file/video''</font>"
 +
 +
<FONT Color=gray>' ''Parte relativa alla decodifica audio:''</font>
 +
  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)
 +
  con.LinkTo(res)
 +
  res.LinkTo(ask)
 +
 +
<FONT Color=gray>' ''Parte relativa alla decodifica video:''</font>
 +
  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)
 +
  bin2.LinkLaterTo(vid)
 +
  vid.LinkTo(vsk)
 +
 +
<FONT Color=gray>' ''Avvia entrambe le Pipeline:''</font>
 +
  pl1.Play
 +
  pl2.Play
 +
 +
  Repeat
 +
    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)
 +
    Write "\rTempo trascorso: \e[31m" & Str(d1) & "\e[0m  -  Durata del video: " & Str(d2) &
 +
          "  -  Tempo rimanente: " & Str(Date(0, 0, 0, 0, 0, 0, DateDiff(d1, d2, gb.Millisecond)))
 +
  Until Fix(pl2.Pos) >= Fix(pl2.Duration)
 +
 +
<FONT Color=gray>' ''Al termine dell'esecuzione del video, chiude entrambe le Pipeline:''</font>
 +
  pl1.Close
 +
  pl2.Close
 +
 +
'''End'''
 +
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 src1, src2 As MediaControl
 +
  Dim bin, con, res, ask As MediaControl
 +
  Dim bin2, vid, vsk As MediaControl
 +
  Dim filevideo As String
 +
  Dim d1, d2 As Date
 +
 +
  filevideo = "<FONT Color=gray>''/percorso/del/file/video''</font>"
 +
 +
<FONT Color=gray>' ''Parte relativa alla decodifica audio:''</font>
 +
  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)
 +
  con.LinkTo(res)
 +
  res.LinkTo(ask)
 +
 +
<FONT Color=gray>' ''Parte relativa alla decodifica video:''</font>
 +
  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)
 +
  bin2.LinkLaterTo(vid)
 +
  vid.LinkTo(vsk)
 +
 +
<FONT Color=gray>' ''Avvia entrambe le Pipeline:''</font>
 +
  pl1.Play
 +
  pl2.Play
 +
 +
  Repeat
 +
    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>
 +
  pl1.Close
 +
  pl2.Close
 +
 +
'''End'''
  
  

Versione delle 11:36, 23 ago 2022

Il componente gb.media offre la possibilità di sfruttare le funzionalità della piattaforma multimediale modulare GStreamer per la gestione di file video.

E' possibile eseguire i file video utilizzando la Classe MediaPlayer oppure le risorse delle Classi MediaPipeline e MediaControl.

Si potrà scegliere se far mostrare il video in un controllo GUI (ad esempio una DrawingArea) posto sul Form, oppure in una finestra automaticamente aperta dalle risorse del componente gb.media. Nel caso si utilizzi una DrawingArea, bisogna impostare un qualsiasi colore la sua proprietà .Background.


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 bo As Boolean


Public Sub Main()

 Dim mp As MediaPlayer
  
 With mp = New MediaPlayer
   .URL = Media.URL("/percorso/del/file/video")
   .Play()
   Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000)
   Repeat
' Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:
     Write "\r\e[0mTempo trascorso: \e[1m\e[31m" & Str(Time(0, 0, 0, .Position * 1000))
     Wait 0.01
   Until (mp.Position >= mp.Duration) Or bo
   .Stop
   .Close
 End With

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

End

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

 bo = True
 
End


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
   .URL = Media.URL("/percorso/del/file/video")
' Imposta il controllo dell'uscita video da usare:
   .SetWindow(da)  ' [Nota 1]
 End With
  
End

Public Sub Button1_Click()
 
' Esegue il file video:
 mp.Play()
  
 Repeat
' Una brevissima pausa consente di mostrare e di agire sugli eventuali oggetti posti sul Form:
   Wait 0.01
   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()
  
 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://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm"


Eseguire un file video usando il plugin "Playbin" mediante le Classi MediaPipeline e MediaControl

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

Con applicazione a "riga di comando"

Private pl As MediaPipeline


Public Sub Main()
 
 Dim bin As MediaControl
 Dim filevideo As String
 
 filevideo = Uri("/percorso/del/file/video")
 
 pl = New MediaPipeline As "Pipe"
 
 bin = New MediaControl(pl, "playbin")
 bin["uri"] = filevideo
 bin["volume"] = 0.6     ' Volume: da 0.00 a 1.0
 
 pl.Play 
 
 Print "\r\e[0mDurata del video: "; Time(0, 0, 0, pl.Duration * 1000)
 
' Pone un'attesa pari alla durata del video, per farlo eseguire sino alla fine:
 Wait pl.Duration
 
 pl.Stop
 pl.Close
' Consente di terminare il programma evitando l'uso di 'Quit'
 pl = Null
 
 Write "\n\e[0mEsecuzione terminata !"
 
End

Private Function Uri(s As String) As String
 
 Return "File:/" &/ s
 
End

Con applicazione grafica

In quest'altro esempio utilizzeremo un progetto grafico, nel quale il video sarà mostrato all'interno di una "DrawingArea" posta sul "Form" principale

Private pl As MediaPipeline


Public Sub Button1_Click()
 
 Dim bin As MediaControl
 Dim filevideo As String
 
 filevideo = Uri("/percorso/del/file/video")
 
 pl = New MediaPipeline As "Pipe"
 
 bin = New MediaControl(pl, "playbin")
 bin["uri"] = filevideo
 bin["volume"] = 0.6     ' Volume: da 0.00 a 1.0
 
' Imposta la superficie grafica ove mostrare il video:
 bin.SetWindow(DrawingArea1)
 
 pl.Play
 
 Wait pl.Duration
 
 pl.Stop
 pl.Close
 
 Me.Text = "Esecuzione terminata !"
  
End

Private Function Uri(s As String) As String
 
 Return "File:/" &/ s
 
End

Public Sub Pipe_Position()
 
 Me.Title = "Durata video: " & Str(Time(0, 0, 0, pl.Duration * 1000)) &
            "   -   Tempo trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000))
 
End

Esecuzione di un video da un indirizzo web

Va precisato che con il plug-in "playbin" alla sua Proprietà "uri" si passerà il percorso del file video, anticipato dal prefisso "File:/".
Se, invece, il video da eseguire ha un indirizzo web, allora alla predetta Proprietà "uri" va passato direttamente l'indirizzo web del video:

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


Eseguire un file video usando il plugin "Decodebin" mediante le Classi MediaPipeline e MediaControl

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.

Mostriamo un esempio in applicazione a riga di comando:

Public Sub Main()

 Dim pl1, pl2 As New MediaPipeline
 Dim src1, src2 As MediaControl
 Dim bin, con, res, ask As MediaControl
 Dim bin2, vid, vsk As MediaControl
 Dim filevideo As String
 Dim d1, d2 As Date

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

' Parte relativa alla decodifica audio:
 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)
 con.LinkTo(res)
 res.LinkTo(ask)

' Parte relativa alla decodifica video:
 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)
 bin2.LinkLaterTo(vid)
 vid.LinkTo(vsk)

' Avvia entrambe le Pipeline:
 pl1.Play
 pl2.Play

 Repeat
   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)
   Write "\rTempo trascorso: \e[31m" & Str(d1) & "\e[0m  -  Durata del video: " & Str(d2) &
         "  -  Tempo rimanente: " & Str(Date(0, 0, 0, 0, 0, 0, DateDiff(d1, d2, gb.Millisecond)))
 Until Fix(pl2.Pos) >= Fix(pl2.Duration)

' Al termine dell'esecuzione del video, chiude entrambe le Pipeline:
 pl1.Close
 pl2.Close

End

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 src1, src2 As MediaControl
 Dim bin, con, res, ask As MediaControl
 Dim bin2, vid, vsk As MediaControl
 Dim filevideo As String
 Dim d1, d2 As Date

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

' Parte relativa alla decodifica audio:
 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)
 con.LinkTo(res)
 res.LinkTo(ask)

' Parte relativa alla decodifica video:
 src2 = New MediaControl(pl2, "filesrc")
 src2["location"] = filevideo
 bin2 = New MediaControl(pl2, "decodebin")
 vid = New MediaControl(pl2, "videoconvert")
 vsk = New MediaControl(pl2, "xvimagesink")
 vsk.SetWindow(DrawingArea1)

 src2.LinkTo(bin2)
 bin2.LinkLaterTo(vid)
 vid.LinkTo(vsk)

' Avvia entrambe le Pipeline:
 pl1.Play
 pl2.Play

 Repeat
   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)

' Al termine dell'esecuzione del video, chiude entrambe le Pipeline:
 pl1.Close
 pl2.Close

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