Catturare il video riprodotto in un Controllo MediaView del componente gb.media.form

Da Gambas-it.org - Wikipedia.

Catturare solo il video (senza audio) riprodotto in un Controllo "MediaView"

Di seguito mostriamo un possibile codice per catturare il video (solo il video, senza audio) riprodotto in un Controllo MediaView del Componente gb.media.
Dai dati video catturati verrà poi creato un file video.

Il Controllo MediaView è composto da "Figli" (Children) e "sotto-figli" (...nipoti).

Uno di questi "sotto-figli" è una DrawingArea, che è l'Oggetto grafico con cui il Controllo MediaView visualizza immagini e video.

Individueremo, dunque, il numero di identificazione di questa DrawingArea, costitutiva del Controllo MediaView, e con una particolare Proprietà del plugin "ximagesrc" cattureremo il video che essa mostra.
Si utilizzeranno le Classi MediaPipeline e MediaControl 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

Creare un file video "MP4"

Event Evento


Public Sub Form_Open()

 Me.Show
 Wait 0.1

 MediaView1.URL = "/percorso/del/file/video/da/catturare"

 Repeat 
    Wait 0.01
 Until MediaView1.Position > 0.0

' Resta in attesa finché la registrazione non viene avviata dall'utente, cliccando sul tastino virtuale di avvio in basso a sinistra del Controllo "MadiaView":
 Repeat 
   Wait 0.01
 Until MediaView1.State = Media.Playing

 Raise Evento

End


Public Sub Form_Evento()
 
 Dim ob As Object
 Dim pn1, pn2 As Panel
 Dim DrawingArea1 As DrawingArea
 Dim pl As MediaPipeline
 Dim src, cnv, enc, mux, snk As MediaControl
 
' Individua la "DrawingArea", "nipote" del Controllo "MediaView":
 ob = MediaView1.Children[0]
 pn1 = ob.Children[0]
 pn2 = pn1.Children[0]
 DrawingArea1 = pn2.Children[0]

 pl = New MediaPipeline 
 
 src = New MediaControl(pl, "ximagesrc")
' Assegna alla Proprietà "xid" il numero di identificazione della "DrawingArea":
 src["xid"] = DrawingArea1.Id
 cnv = New MediaControl(pl, "videoconvert")
 enc = New MediaControl(pl, "x264enc")
 enc["pass"] = 5
 enc["quantizer"] = 26
 enc["speed-preset"] = 6
 mux = New MediaControl(pl, "mp4mux")
 mux["fragment-duration"] = 2048
 snk = New MediaControl(pl, "filesink")
' Imposta il percorso del file finale avente formato "MP4":
 snk["location"] = "/tmp/video.mp4"

' Collega i plugin di "GStreamer", per creare la pipeline:
 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

 pl.play

 Wait MediaView1.Duration

 pl.Stop
 pl.Close
 Print "File video MP4 creato !"

End

Interruzione anticipata della registrazione

Qualora si intenda anticipare l'interruzione della registrazione rispetto all'intera durata del video, invece della riga:

Wait MediaView1.Duration

si porranno le seguenti:

Repeat 
  Wait 0.01
Until MediaView1.State = Media.Ready

pl.Stop
pl.Close

Ugualmente così anche per gli altri esempi qui appresso.


Creare un file video "Matroska"

Event Evento


Public Sub Form_Open()

 Me.Show
 Wait 0.1

 MediaView1.URL = "/percorso/del/file/video/da/catturare"

 Repeat 
    Wait 0.01
 Until MediaView1.Position > 0.0

' Resta in attesa finché la registrazione non viene avviata dall'utente, cliccando sul tastino virtuale di avvio in basso a sinistra del Controllo "MadiaView":
 Repeat 
   Wait 0.01
 Until MediaView1.State = Media.Playing

 Raise Evento

End


Public Sub Form_Evento()
 
 Dim ob As Object
 Dim pn1, pn2 As Panel
 Dim DrawingArea1 As DrawingArea
 Dim pl As MediaPipeline
 Dim src, cnv, enc, mux, snk As MediaControl
 
' Individua la "DrawingArea", "nipote" del Controllo "MediaView":
 ob = MediaView1.Children[0]
 pn1 = ob.Children[0]
 pn2 = pn1.Children[0]
 DrawingArea1 = pn2.Children[0]

 pl = New MediaPipeline 
 
 src = New MediaControl(pl, "ximagesrc")
' Assegna alla Proprietà "xid" il numero di identificazione della "DrawingArea":
 src["xid"] = DrawingArea1.Id
 cnv = New MediaControl(pl, "videoconvert")
 enc = New MediaControl(pl, "x264enc")
 mux = New MediaControl(pl, "matroskamux") 
 snk = New MediaControl(pl, "filesink")
' Imposta il percorso del file finale avente formato "MKV" (Matroska):
 snk["location"] = "/tmp/video.mkv"

' Collega i plugin di "GStreamer", per creare la pipeline:
 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

 pl.play

 Wait MediaView1.Duration

 pl.Stop
 pl.Close
 Print "File video MKV creato !"

End


Creare un file video "OGG-Theora"

Event Evento


Public Sub Form_Open()

 Me.Show
 Wait 0.1

 MediaView1.URL = "/percorso/del/file/video/da/catturare"

 Repeat 
    Wait 0.01
 Until MediaView1.Position > 0.0

' Resta in attesa finché la registrazione non viene avviata dall'utente, cliccando sul tastino virtuale di avvio in basso a sinistra del Controllo "MadiaView":
 Repeat 
   Wait 0.01
 Until MediaView1.State = Media.Playing

 Raise Evento

End


Public Sub Form_Evento()
 
 Dim ob As Object
 Dim pn1, pn2 As Panel
 Dim DrawingArea1 As DrawingArea
 Dim pl As MediaPipeline
 Dim src, cnv, enc, mux, snk As MediaControl
 Dim flt As MediaFilter
 
' Individua la "DrawingArea", "nipote" del Controllo "MediaView":
 ob = MediaView1.Children[0]
 pn1 = ob.Children[0]
 pn2 = pn1.Children[0]
 DrawingArea1 = pn2.Children[0]

 pl = New MediaPipeline 
 
 src = New MediaControl(pl, "ximagesrc")
' Assegna alla Proprietà "xid" il numero di identificazione della "DrawingArea":
 src["xid"] = DrawingArea1.Id
 cnv = New MediaControl(pl, "videoconvert")
 flt = New MediaFilter(pl, "video/x-raw,framerate=5/1")
 enc = New MediaControl(pl, "theoraenc")
 mux = New MediaControl(pl, "oggmux")
 snk = New MediaControl(pl, "filesink")
' Imposta il percorso del file finale avente formato "OGG":
 snk["location"] = "/tmp/video.ogg"

' Collega i plugin di "GStreamer", per creare la pipeline:
 src.LinkTo(cnv)
 cnv.LinkTo(flt)
 flt.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

 pl.play

 Wait MediaView1.Duration

 pl.Stop
 pl.Close
 Print "File video OGG creato !"

End


Creare un file video "FLV"

Event Evento


Public Sub Form_Open()

 Me.Show
 Wait 0.1

 MediaView1.URL = "/percorso/del/file/video/da/catturare"

 Repeat 
    Wait 0.01
 Until MediaView1.Position > 0.0

' Resta in attesa finché la registrazione non viene avviata dall'utente, cliccando sul tastino virtuale di avvio in basso a sinistra del Controllo "MadiaView":
 Repeat 
   Wait 0.01
 Until MediaView1.State = Media.Playing

 Raise Evento

End


Public Sub Form_Evento()
 
 Dim ob As Object
 Dim pn1, pn2 As Panel
 Dim DrawingArea1 As DrawingArea
 Dim pl As MediaPipeline
 Dim src, cnv, enc, mux, snk As MediaControl
 
' Individua la "DrawingArea", "nipote" del Controllo "MediaView":
 ob = MediaView1.Children[0]
 pn1 = ob.Children[0]
 pn2 = pn1.Children[0]
 DrawingArea1 = pn2.Children[0]

 pl = New MediaPipeline 
 
 src = New MediaControl(pl, "ximagesrc")
' Assegna alla Proprietà "xid" il numero di identificazione della "DrawingArea":
 src["xid"] = DrawingArea1.Id
 cnv = New MediaControl(pl, "videoconvert")
 enc = New MediaControl(pl, "x264enc")
 mux = New MediaControl(pl, "flvmux") 
 snk = New MediaControl(pl, "filesink")
' Imposta il percorso del file finale avente formato "FLV":
 snk["location"] = "/tmp/video.flv"

' Collega i plugin di "GStreamer", per creare la pipeline:
 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

 pl.play

 Wait MediaView1.Duration

 pl.Stop
 pl.Close
 Print "File video FLV creato !"

End


Creare un file video "AVI"

Event Evento


Public Sub Form_Open()

 Me.Show
 Wait 0.1

 MediaView1.URL = "/percorso/del/file/video/da/catturare"

 Repeat 
    Wait 0.01
 Until MediaView1.Position > 0.0

' Resta in attesa finché la registrazione non viene avviata dall'utente, cliccando sul tastino virtuale di avvio in basso a sinistra del Controllo "MadiaView":
 Repeat 
   Wait 0.01
 Until MediaView1.State = Media.Playing

 Raise Evento

End


Public Sub Form_Evento()
 
 Dim ob As Object
 Dim pn1, pn2 As Panel
 Dim DrawingArea1 As DrawingArea
 Dim pl As MediaPipeline
 Dim src, cnv, mux, snk As MediaControl
 
' Individua la "DrawingArea", "nipote" del Controllo "MediaView":
 ob = MediaView1.Children[0]
 pn1 = ob.Children[0]
 pn2 = pn1.Children[0]
 DrawingArea1 = pn2.Children[0]

 pl = New MediaPipeline 
 
 src = New MediaControl(pl, "ximagesrc")
' Assegna alla Proprietà "xid" il numero di identificazione della "DrawingArea":
 src["xid"] = DrawingArea1.Id
 cnv = New MediaControl(pl, "videoconvert")
 mux = New MediaControl(pl, "avimux") 
 snk = New MediaControl(pl, "filesink")
' Imposta il percorso del file finale avente formato "AVI":
 snk["location"] = "/tmp/video.avi"

' Collega i plugin di "GStreamer", per creare la pipeline:
 src.LinkTo(cnv)
 cnv.LinkTo(mux)
 mux.LinkTo(snk)

 pl.play

 Wait MediaView1.Duration

 pl.Stop
 pl.Close
 Print "File video AVI creato !"

End


Catturare il video comprensivo di audio riprodotto in un Controllo "MediaView"

Di seguito mostriamo un possibile codice per catturare il video e l'audio riprodotti in un Controllo MediaView del Componente gb.media.
Dai dati video catturati verrà poi creato un file audio/video di formato "OGG-Theora".

Nell'esempio, che segue, per avviare e registrare il video sarà sufficiente premere il tastino virtuale di avvio in basso a sinistra del Controllo MediaView, successivamente, per fermare e creare il file audio/video finale, premere il tastino virtuale di arresto in basso a sinistra.
Altresì per assicurarsi che anche l'audio del video venga registrato, attivare il dispositivo di registrazione audio del sistema.

Private pl As MediaPipeline


Public Sub Form_Open()

 Dim srcv, vcon, que1, the, que2, srca, que3, acon, vor, que4, ogg, snk As MediaControl
 Dim flv, fla As MediaFilter

 Me.Show

 MediaView1.URL = "/percorso/del/file/video/da/registrare"

 If Exist("/tmp/video.ogg") Then Kill "/tmp/video.ogg"

 pl = New MediaPipeline 

 srcv = New MediaControl(pl, "ximagesrc")
' Si assegna alla proprietà "xid" il numero identificativo della finestra da registrare:
 srcv["xid"] = MediaView1.Id
' La cattura avviene con 2 frame al secondo:
 flv = New MediaFilter(pl, "video/x-raw,framerate=32/1")
 vcon = New MediaControl(pl, "videoconvert")
 que1 = New MediaControl(pl, "queue")
 the = New MediaControl(pl, "theoraenc")
 que2 = New MediaControl(pl, "queue")
 srca = New MediaControl(pl, "autoaudiosrc")
 fla = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2,depth=16,bit=16")
 que3 = New MediaControl(pl, "queue")
 acon = New MediaControl(pl, "audioconvert")
 vor = New MediaControl(pl, "vorbisenc")
 que4 = New MediaControl(pl, "queue")
 ogg = New MediaControl(pl, "oggmux")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/video.ogg"

' Parte video:
 srcv.LinkTo(flv)
 flv.LinkTo(vcon)
 vcon.LinkTo(que1)
 que1.LinkTo(the)
 the.LinkTo(que2)
 que2.LinkTo(ogg)

' Parte audio:
 srca.LinkTo(fla)
 fla.LinkTo(que3)
 que3.LinkTo(acon)
 acon.LinkTo(vor)
 vor.LinkTo(que4)

' Combinazione dei dati audio e video:
 que4.LinkTo(ogg)

' Creazione del file "OGG-Theora" finale:
 ogg.LinkTo(snk)

' Resta in attesa finché la registrazione non viene avviata dall'utente, cliccando sul tastino virtuale di avvio in basso a sinistra del Controllo "MadiaView":
 Repeat 
   Wait 0.01
 Until MediaView1.State = Media.Playing

' Avvia la ripresa audio/video:
 pl.Play()

' Il ciclo dura, finché la registrazione non viene fermata dall'utente, cliccando sul tastino virtuale di arresto in basso a sinistra del Controllo "MediaView":
 Repeat 
   Wait 0.01
 Until MediaView1.State = Media.Ready

' Ferma la registrazione:
 pl.Stop
 pl.Close
 Print "Registrazione fermata"

End


Note

[1] Vedere anche questa pagina della wiki: Catturare con il Componente gb.media quanto mostrato dalla finestra di un programma o sulla Scrivania e farne un file video