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

Da Gambas-it.org - Wikipedia.
Riga 13: Riga 13:
 
        
 
        
 
  <FONT color=gray>' ''Crea una "DrawingArea" come oggetto GUI da usare per l'uscita video:''</font>
 
  <FONT color=gray>' ''Crea una "DrawingArea" come oggetto GUI da usare per l'uscita video:''</font>
  With da = New DrawingArea(Me)
+
  With da = New DrawingArea(Me)
    .X = 10
+
    .X = 10
    .Y = 10
+
    .Y = 10
    .W = 300
+
    .W = 300
    .H = 300
+
    .H = 300
    .Background = Color.Black
+
    .Background = Color.Black
  End With
+
  End With
 
    
 
    
  With mp = New MediaPlayer
+
  With mp = New MediaPlayer
    .URL = Media.URL("<FONT color=gray>''/percorso/del/file/video''</font>")
+
    .URL = Media.URL("<FONT color=gray>''/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'''
Riga 33: Riga 33:
 
    
 
    
 
  <FONT color=gray>' ''Esegue il file video:''</font>
 
  <FONT color=gray>' ''Esegue il file video:''</font>
  mp.Play()
+
  mp.Play()
 
    
 
    
  Do
+
  Repeat
 
  <FONT color=gray>' ''Una brevissima pausa consente di mostrare e di agire sugli eventuali oggetti posti sul Form:''</font>
 
  <FONT color=gray>' ''Una brevissima pausa consente di mostrare e di agire sugli eventuali oggetti posti sul Form:''</font>
    Wait 0.01
+
    Wait 0.01
    TextLabel1.Text = "\rDurata del video: " & CStr(Time(0, 0, 0, 0, 0, 0, mp.Duration * 1000)) &
+
    TextLabel1.Text = "\rDurata del video: " & CStr(Time(0, 0, 0, 0, 0, 0, mp.Duration * 1000)) &
 
                       "  -  Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000))
 
                       "  -  Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000))
  Loop Until mp.Position >= mp.Duration
+
  Until mp.Position >= mp.Duration
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 47: Riga 47:
 
  '''Public''' Sub Button2_Click()
 
  '''Public''' Sub Button2_Click()
 
    
 
    
  mp.Stop
+
  mp.Stop
  mp.Close
+
  mp.Close
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 55: Riga 55:
 
  '''Public''' Sub ToggleButton1_Click()
 
  '''Public''' Sub ToggleButton1_Click()
 
    
 
    
  If ToggleButton1.Value Then
+
  If ToggleButton1.Value Then
    mp.Pause
+
    mp.Pause
  Else
+
  Else
    mp.Play
+
    mp.Play
  Endif
+
  Endif
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 76: Riga 76:
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
    
 
    
  mp.URL = Media.URL("<FONT color=gray>''/percorso/del/file/video''</font>")
+
  mp.URL = Media.URL("<FONT color=gray>''/percorso/del/file/video''</font>")
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 84: Riga 84:
 
    
 
    
 
  <FONT color=gray>' ''Esegue il video:''</font>
 
  <FONT color=gray>' ''Esegue il video:''</font>
  mp.Play()
+
  mp.Play()
 
    
 
    
  Do
+
  Repeat
 
  <FONT color=gray>' ''Una brevissima pausa consente di agire sugli eventuali oggetti posti sul Form:''</font>
 
  <FONT color=gray>' ''Una brevissima pausa consente di agire sugli eventuali oggetti posti sul Form:''</font>
    Wait 0.01
+
    Wait 0.01
    TextLabel1.Text = "\rDurata del video: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) &
+
    TextLabel1.Text = "\rDurata del video: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) &
 
                       "  -  Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000))
 
                       "  -  Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000))
  Loop Until mp.Position >= mp.Duration
+
  Until mp.Position >= mp.Duration
 
    
 
    
  mp.Stop
+
  mp.Stop
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 100: Riga 100:
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
    
 
    
  mp.Stop
+
  mp.Stop
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 107: Riga 107:
 
  '''Public''' Sub ToggleButton1_Click()
 
  '''Public''' Sub ToggleButton1_Click()
 
    
 
    
  If ToggleButton1.Value Then
+
  If ToggleButton1.Value Then
    mp.Pause
+
    mp.Pause
  Else
+
  Else
    mp.Play
+
    mp.Play
  Endif
+
  Endif
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione delle 07:01, 8 lug 2021

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

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

Eseguire il video in uno specifico controllo GUI posto sul form

Nel seguente esempio il video verrà mostrato in all'interno di uno specifico controllo GUI (ad esempio una DrawingArea) posto sul Form:

Private mp As MediaPlayer
  

Public Sub Form_Open()

 Dim da As DrawingArea
     
' Crea una "DrawingArea" come oggetto GUI da usare per l'uscita video:
 With da = New DrawingArea(Me)
   .X = 10
   .Y = 10
   .W = 300
   .H = 300
   .Background = Color.Black
 End With
  
 With mp = New MediaPlayer
   .URL = Media.URL("/percorso/del/file/video")
' Imposta il controllo dell'uscita video da usare:
   .SetWindow(da)  ' [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
   TextLabel1.Text = "\rDurata del video: " & CStr(Time(0, 0, 0, 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

E' possibile far mostrare il video in una finestra automaticamente aperta da Gstreamer all'esterno del Form. Ovviamente non verrà impostato alcuno specifico controllo grafico GUI.

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

Mostriamo un semplice esempio in ambiente grafico:

Private mp As New MediaPlayer
  

Public Sub Form_Open()
  
 mp.URL = Media.URL("/percorso/del/file/video")
  
End


Public Sub Form_Activate()
  
' Esegue il video:
 mp.Play()
  
 Repeat
' Una brevissima pausa consente di agire sugli eventuali oggetti posti sul Form:
   Wait 0.01
   TextLabel1.Text = "\rDurata 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
  
 mp.Stop
 
End


Public Sub Button1_Click()
  
 mp.Stop
  
End


Public Sub ToggleButton1_Click()
  
 If ToggleButton1.Value Then
   mp.Pause
 Else
   mp.Play
 Endif
  
End


Eseguire un video in un'applicazione a linea di comando

Vediamo ora un esempio con un'applicazione a linea di comando.
Si potrà chiudere il programma durante l'esecuzione del file audio semplicemente premendo sul tasto "Invio":

Private bo As Boolean


Public Sub Main()
 
 Dim mp As New MediaPlayer

 mp.URL = Media.URL("/percorso/del/file/video")
  
' Esegue il brano:
 mp.Play()
 
' Garantisce l'acquisizione della "durata" del video, affinché non si esca prematuramente dal ciclo successivo e venga così eseguito il file:
 Repeat
   Wait 0.01
 Until mp.Duration > 0
 
 Repeat
   Write "\rDurata del video: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) &
         "   -   Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000))
   Wait 0.001
 Until (mp.Position >= mp.Duration) Or (bo = True)
 
 mp.Close
 Quit
 
End
 
 
Public Sub Application_Read()
 
 bo = True
 
End


Eseguire un file video usando il plugin "Playbin" mediante la Classe MediaPipeline

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