Mostrare un segnale di test video mediante il Componente gb.media

Da Gambas-it.org - Wikipedia.

Per mostrare un segnale di test video mediante il Componente gb.media all'interno della superficie di un oggetto posto sul Form, è possibile adottare il seguente semplice codice:

Private pl As MediaPipeline


Public Sub Form_Open()
 
  Dim DrawingArea1 As DrawingArea
  Dim Button1 As Button
  Dim src, xim As MediaControl

  With Me
   .W = 640
   .H = 480
 End With
' Crea una "DrawingArea" come oggetto GUI da usare per l'uscita video:
  With DrawingArea1 = New DrawingArea(Me)
    .X = 10
    .Y = 10
    .W = 320
    .H = 240
  End With
  With Button1 = New Button(Me) As "Button1"
    .X = Me.W * 0.8
    .Y = Me.H * 0.2
    .W = Me.W * 0.1
    .H = Me.H * 0.2
  End With

  pl = New MediaPipeline
  
  src = New MediaControl(pl, "videotestsrc")
  xim = New MediaControl(pl, "ximagesink")
  
' Imposta la superficie dell'Oggetto, ove sarà mostrato il segnale di controllo video:
  xim.SetWindow(DrawingArea1)
  
  src.LinkTo(xim)

  pl.Play()
  
End


Public Sub Button1_Click()
  
  pl.Stop()
  pl.Close()

End


Volendo invece ottenere un effetto di test video-audio, si potranno utilizzare due Pipeline di GStreamer: una dedicata alla gestione del test video, che sarà mostrato in una finestra esterna automaticamente generata dalle risorse di GStreamer; l'altra è invece dedicata alla gestione del test audio, per il quale sarà emesso un tono continuo.

Mostriamo un esempio questa volta con un'applicazione a riga di comando:

Public Sub Main()
 
  Dim pl1, pl2 As Mediapipeline
  Dim src1, src2, con, res, snk1, snk2 As MediaControl

' "Pipeline" dedicata al video:
  pl1 = New MediaPipeline
  src1 = New MediaControl(pl1, "videotestsrc")
  snk1 = New MediaControl(pl1, "ximagesink")
  src1.LinkTo(snk1)
  
' "Pipeline" dedicata all'audio:
  pl2 = New MediaPipeline
  src2 = New MediaControl(pl2, "audiotestsrc")
  con = New MediaControl(pl2, "audioconvert")
  res = New MediaControl(pl2, "audioresample")
  snk2 = New MediaControl(pl2, "alsasink")
  src2.LinkTo(con)
  con.LinkTo(res)
  res.LinkTo(snk2)

  pl1.play()
  pl2.play()

  While pl2.State = Media.Playing
    Wait 0.01
  Wend 

' Essendo stato sollevato l'Evento "Application_Read()", si dovrà usare l'istruzione "Quit" per chiudere completamente il programma:
  Quit

End


' Ponendo il puntatore del mouse nella console/terminale e premendo il tasto "Invio" della tastiera, si arresterà il programma.
Public Sub Application_Read()

 pl1.Stop
 pl1.Close
 pl2.Stop
 pl2.Close

End

Come il precedente codice, ma il test-video sarà dinamico e verrà mostrato all'interno di una "DrawingArea" usando il Metodo ".SetWindow()" della Classe MediaControl:

Private pl1 As MediaPipeline
Private pl2 As MediaPipeline


Public Sub Form_Open()

  Dim drawingArea1 As DrawingArea
  Dim Button1 As Button

  With Me
    .W = 640
    .H = 480
  End With
 
' Crea una "DrawingArea" come oggetto GUI da usare per l'uscita video:
  With drawingArea1 = New DrawingArea(Me)
    .X = 10
    .Y = 10
    .W = 320
    .H = 240
  End With
  With Button1 = New Button(Me) As "Button1"
    .X = Me.W * 0.8
    .Y = Me.H * 0.2
    .W = Me.W * 0.1
    .H = Me.H * 0.2
  End With

 Dim src1, src2, con, res, snk1, snk2 As MediaControl
  
' "Pipeline" dedicata al video:
 pl1 = New MediaPipeline
 src1 = New MediaControl(pl1, "videotestsrc")
 src1["is-live"] = True
 src1["horizontal-speed"] = 1
 snk1 = New MediaControl(pl1, "xvimagesink")
 src1.LinkTo(snk1)
 snk1.SetWindow(drawingArea1)

' "Pipeline" dedicata all'audio:
 pl2 = New MediaPipeline
 src2 = New MediaControl(pl2, "audiotestsrc")
 con = New MediaControl(pl2, "audioconvert")
 res = New MediaControl(pl2, "audioresample")
 snk2 = New MediaControl(pl2, "autoaudiosink")
 src2.LinkTo(con)
 con.LinkTo(res)
 res.LinkTo(snk2)

 pl1.play()
 pl2.play()

End


Public Sub Button1_Click()

  pl1.Stop
  pl1.Close
  pl2.Stop
  pl2.Close

End