Differenze tra le versioni di "Catturare con il Componente gb.media quanto mostrato dalla finestra di un programma o sulla Scrivania e farne un file video"

Da Gambas-it.org - Wikipedia.
 
(15 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Con le risorse del Componente "gb.media" è possibile catturare immagini di quanto avviene in una finestra di un programma e farne un file video.
+
Con le risorse del Componente "gb.media" è possibile catturare immagini di quanto avviene in una finestra di un programma di Gambas o esterno e farne un file video.
  
 
Va detto che questa possibilità di registrazione video è estesa ovviamente anche alla Scrivania (''Desktop''), e che in tal caso sarà catturato anche il puntatore del mouse.
 
Va detto che questa possibilità di registrazione video è estesa ovviamente anche alla Scrivania (''Desktop''), e che in tal caso sarà catturato anche il puntatore del mouse.
  
Per individuare la <SPAN Style="text-decoration:underline">finestra</span>, che si intende registrare, bisognerà passare alla Proprietà "xid" del ''MediaControl'' "ximagesrc" il [[Individuare_ed_estrarre_l'ID_della_finestra_di_un_programma|numero identificativo della finestra]] medesima. Per la ''Scrivania'' è anche possibile impostare più semplicemente il suo ID di default uguale a 0 (zero).
+
Per individuare la <U>finestra</u>, che si intende registrare, bisognerà passare alla Proprietà "xid" del ''MediaControl'' "ximagesrc" il <U>numero identificativo della finestra</u> medesima. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 +
<BR>Per la ''Scrivania'' è anche possibile impostare più semplicemente il suo ID di default uguale a 0 (zero).
  
=Creare un file video in formato MP4=
+
Se si intende creare un file video di ciò che avviene in un ''Controllo'' grafico di Gambas, si passerà alla Proprietà "xid" del ''MediaControl'' "ximagesrc" semplicemente il ''numero identificativo'' di detto Oggetto grafico.
 +
 
 +
=Creare un file video in formato "MP4"=
  
 
===Catturare quanto accade visivamente sulla ''Scrivania''===
 
===Catturare quanto accade visivamente sulla ''Scrivania''===
Riga 29: Riga 32:
 
   mux["fragment-duration"] = 2048
 
   mux["fragment-duration"] = 2048
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "mkv" (Matroska):''</font>
+
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "MP4":''</font>
   snk["location"] = "/tmp/file.mp4"
+
   snk["location"] = "/tmp/video.mp4"
 
   
 
   
 
  <FONT Color=gray>' ''Collega i plugin di "GStreamer" utilizzati:''</font>
 
  <FONT Color=gray>' ''Collega i plugin di "GStreamer" utilizzati:''</font>
Riga 57: Riga 60:
 
  End
 
  End
  
===Catturare quanto accade visivamente in un Controllo "MediView"===
+
===Catturare quanto avviene visivamente in un Oggetto grafico di Gambas===
Nel seguente esempio si cattureranno i dati video (<U>senza audio</u>) di quanto accade visivamente su un <U>intero</u> Controllo ''MediView'', dai quali si creerà un file video, privo di audio, in formato MP4.
+
In questo esempio registriamo in un video quanto avviene visivamente in un Oggetto grafico di Gambas, ad esempio un ''ValueBox''.
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
 
   
 
   
Riga 69: Riga 72:
 
   
 
   
 
   src = New MediaControl(pl, "ximagesrc")
 
   src = New MediaControl(pl, "ximagesrc")
  <FONT Color=gray>' ''Assegna alla Proprietà "xid" del plugin "ximagesrc" il numero identificativo del Controllo "MediaView", affinché catturi quanto sull'<U>intero</u> Controllo è visualizzato:''</font>
+
  <FONT Color=gray>' ''Assegna alla proprietà "xid" del plugin "ximagesrc" il numero identificativo del "ValueBox", affinché catturi quanto da essa visualizzato:''</font>
   src["xid"] = MediaView1.Id
+
   src["xid"] = ValueBox1.Id
 
   cnv = New MediaControl(pl, "videoconvert")
 
   cnv = New MediaControl(pl, "videoconvert")
 
   enc = New MediaControl(pl, "x264enc")
 
   enc = New MediaControl(pl, "x264enc")
Riga 79: Riga 82:
 
   mux["fragment-duration"] = 2048
 
   mux["fragment-duration"] = 2048
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "mkv" (Matroska):''</font>
+
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "MP4":''</font>
   snk["location"] = "/tmp/file.mp4"
+
   snk["location"] = "/tmp/video.mp4"
 
   
 
   
<FONT Color=gray>' ''Collega i plugin di "GStreamer" utilizzati:''</font>
 
 
   src.LinkTo(cnv)
 
   src.LinkTo(cnv)
 
   cnv.LinkTo(enc)
 
   cnv.LinkTo(enc)
Riga 88: Riga 90:
 
   mux.LinkTo(snk)
 
   mux.LinkTo(snk)
 
   
 
   
  MediaView1.URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/video''</font>)
+
End
 
   
 
   
End
 
 
   
 
   
 
  Public Sub Button1_Click()
 
  Public Sub Button1_Click()
 
+
 +
  Dim c As Short = 100
 +
 
  <FONT Color=gray>' ''Avvia la ripresa video:''</font>
 
  <FONT Color=gray>' ''Avvia la ripresa video:''</font>
 
   pl.Play()
 
   pl.Play()
 +
 +
  Repeat
 +
    Dec c
 +
    ValueBox1.Value = c
 +
    Wait 0.01
 +
  Until c == 0
 
   
 
   
 
  End
 
  End
 +
 
   
 
   
 
  Public Sub Button2_Click()
 
  Public Sub Button2_Click()
Riga 105: Riga 115:
 
   pl.Close
 
   pl.Close
 
   
 
   
   Print "Registrazione terminata"
+
   Print "Registrazione Terminata"
 
   
 
   
 
  End
 
  End
  
===Catturare quanto mostrato nella sola e specifica area video di un Controllo "MediaView"===
+
===Catturare quanto accade visivamente in un Controllo "MediaView"===
Nel seguente esempio si cattureranno i dati video (<U>senza audio</u>) di quanto mostrato nella <U>sola e specifica area video</u> di un Controllo ''MediaView'', dai quali si creerà un file video, privo di audio, in formato MP4.
+
Nel seguente esempio si cattureranno i dati video (<U>senza audio</u>) di quanto accade visivamente su un <U>intero</u> Controllo ''MediaView'', dai quali si creerà un file video, privo di audio, in formato MP4. <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
<BR>In particolare il video viene mostrato in una ''DrawingArea'', posta all'interno di un Oggetto grafico ''Panel'', a sua volta ''Figlio'' del Controllo  ''MediaView''. Bisognerà pertanto individuare e gestire tale ''DrawingArea''.
+
 
<BR>Ciò sta a significare anche che è possibile creare dati video di quanto avviene in un ''Oggetto grafico'' di Gambas.
+
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
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
 
   
 
   
Riga 123: Riga 137:
 
   
 
   
 
   src = New MediaControl(pl, "ximagesrc")
 
   src = New MediaControl(pl, "ximagesrc")
  <FONT Color=gray>' ''Individua e poi assegna alla Proprietà "xid" del plugin "ximagesrc" il numero identificativo della "DrawingArea'', affinché catturi quanto mostrato nella <U>sola e specifica area video</u> del Controllo "MediView":''</font>
+
  <FONT Color=gray>' ''Assegna alla Proprietà "xid" del plugin "ximagesrc" il numero identificativo del Controllo "MediaView", affinché catturi quanto sull'<U>intero</u> Controllo è visualizzato:''</font>
  Dim ob As Object
+
   src["xid"] = MediaView1.Id
  Dim pn As Panel
 
  Dim DrawingArea1 as DrawingArea
 
  ob = MediaView1.Children[0]
 
  pn = ob.Children[0]
 
  DrawingArea1 = pn.Children[0]
 
   src["xid"] = DrawingArea1.Id
 
 
 
   cnv = New MediaControl(pl, "videoconvert")
 
   cnv = New MediaControl(pl, "videoconvert")
 
   enc = New MediaControl(pl, "x264enc")
 
   enc = New MediaControl(pl, "x264enc")
Riga 140: Riga 147:
 
   mux["fragment-duration"] = 2048
 
   mux["fragment-duration"] = 2048
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "mkv" (Matroska):''</font>
+
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "MP4":''</font>
   snk["location"] = "/tmp/file.mp4"
+
   snk["location"] = "/tmp/video.mp4"
 
   
 
   
 
  <FONT Color=gray>' ''Collega i plugin di "GStreamer" utilizzati:''</font>
 
  <FONT Color=gray>' ''Collega i plugin di "GStreamer" utilizzati:''</font>
Riga 170: Riga 177:
 
  End
 
  End
  
===Catturare quanto accade visivamente in un programma esterno===
+
===Catturare quanto mostrato nella sola e specifica area video di un Controllo "MediaView"===
Analogamente, si potrà riprendere in un file video .MP4, quanto accade visivamente in un programma esterno.
+
Nel seguente esempio si cattureranno i dati video (<U>senza audio</u>) di quanto mostrato nella <U>sola e specifica area video</u> di un Controllo ''MediaView'', dai quali si creerà un file video, privo di audio, in formato MP4. <BR>In particolare il video viene mostrato in una ''DrawingArea'', posta all'interno di un Oggetto grafico ''Panel'', a sua volta ''Figlio'' del Controllo  ''MediaView''. Bisognerà pertanto individuare e gestire tale ''DrawingArea''.
<BR>Ovviamente alla Proprietà "xid" del plugin "ximagesrc" bisognerà passare il <U>numero identificativo della finestra</u> del programma esterno.
+
<BR>Ciò sta a significare anche che è possibile creare dati video di quanto avviene in un ''Oggetto grafico'' di Gambas.
  
 
+
Assicurarsi che siano installati nel proprio sistema i seguenti plugin di GStreamer:
 
+
* gstreamer1.0-plugins-good
=Creare un file video in formato Matroska=
+
* gstreamer1.0-plugins-bad
===Catturare quanto accade visivamente in un Controllo "MediView"===
+
* gstreamer1.0-plugins-ugly
Nel seguente esempio si cattureranno i dati video (<SPAN Style="text-decoration:underline">senza audio</span>) mostrati in un Controllo ''MediaView'', dai quali si creerà un file video, privo di audio, in formato Matroska (.mkv).
+
* gst-libav
<BR>Ai fini dell'esempio si dovrà utilizzare le Classi "MediaControl" e "MediaPipeline" del Componente gb.media
+
  Private pl As MediaPipeline
<BR>Come già accennato nell'esempio precedente, il Controllo "MediaView" è composto da "Figli" e "Figli secondari" (...nipoti). Uno di questi "sub-Children" è una "DrawingArea", che in sostanza è l'Oggetto grafico <U>specifico</u> con cui il Controllo "MediaView" visualizza immagini e video.
 
<BR>Identificheremo innanzitutto il numero identificativo di questa "DrawingArea", costitutiva del Controllo "MediaView", e con una particolare Proprietà del plugin "ximagesrc" cattureremo il video che essa mostra.
 
  Event Evento
 
 
   
 
   
 
   
 
   
 
  Public Sub Form_Open()
 
  Public Sub Form_Open()
 
   
 
   
   Me.Show
+
   Dim src, cnv, enc, mux, snk As MediaControl
  Wait 0.1
 
 
   
 
   
   MediaView1.URL = "<FONT Color=darkgreen>''/percorso/del/media/da/catturare''</font>"
+
   pl = New MediaPipeline
 
  Repeat
 
    Wait 0.01
 
  Until MediaView1.Position > 0.0
 
 
  Raise Evento
 
 
End
 
 
 
Public Sub Form_Evento()
 
 
   
 
   
 +
  src = New MediaControl(pl, "ximagesrc")
 +
<FONT Color=gray>' ''Individua e poi assegna alla Proprietà "xid" del plugin "ximagesrc" il numero identificativo della "DrawingArea'', affinché catturi quanto mostrato nella <U>sola e specifica area video</u> del Controllo "MediView":''</font>
 
   Dim ob As Object
 
   Dim ob As Object
   Dim pn1, pn2 As Panel
+
   Dim pn As Panel
   Dim DrawingArea1 As DrawingArea
+
   Dim DrawingArea1 as DrawingArea
  Dim pl As MediaPipeline
 
  Dim src, cnv, enc, mux, snk As MediaControl
 
 
 
<FONT Color=gray>' ''Una parte dell'ampia "famiglia" che compone il Controllo "MediaView":''</font>
 
 
   ob = MediaView1.Children[0]
 
   ob = MediaView1.Children[0]
   pn1 = ob.Children[0]
+
   pn = ob.Children[0]
  pn2 = pn1.Children[0]
+
   DrawingArea1 = pn.Children[0]
   DrawingArea1 = pn2.Children[0]
 
 
 
  pl = New MediaPipeline
 
 
 
  src = New MediaControl(pl, "ximagesrc")
 
<FONT Color=gray>' ''Assegna alla proprietà "xid" del plugin "ximagesrc" il numero idetificativo della "DrawingArea", affinché catturi quanto da essa visualizzato:''</font>
 
 
   src["xid"] = DrawingArea1.Id
 
   src["xid"] = DrawingArea1.Id
 +
 
   cnv = New MediaControl(pl, "videoconvert")
 
   cnv = New MediaControl(pl, "videoconvert")
 
   enc = New MediaControl(pl, "x264enc")
 
   enc = New MediaControl(pl, "x264enc")
   mux = New MediaControl(pl, "matroskamux")  
+
  enc["pass"] = 5
 +
  enc["quantizer"] = 26
 +
  enc["speed-preset"] = 6
 +
   mux = New MediaControl(pl, "mp4mux")
 +
  mux["fragment-duration"] = 2048
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "mkv" (Matroska):''</font>
+
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "MP4":''</font>
   snk["location"] = "/tmp/file.mkv"
+
   snk["location"] = "/tmp/video.mp4"
 
+
 
  <FONT Color=gray>' ''Collega i plugin di "GStreamer" utilizzati:''</font>
 
  <FONT Color=gray>' ''Collega i plugin di "GStreamer" utilizzati:''</font>
 
   src.LinkTo(cnv)
 
   src.LinkTo(cnv)
Riga 233: Riga 222:
 
   mux.LinkTo(snk)
 
   mux.LinkTo(snk)
 
   
 
   
   pl.play
+
  MediaView1.URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/video''</font>)
 +
 +
End
 +
 +
Public Sub Button1_Click()
 +
 
 +
<FONT Color=gray>' ''Avvia la ripresa video:''</font>
 +
  pl.Play()
 +
 +
End
 +
 +
Public Sub Button2_Click()
 +
 +
<FONT Color=gray>' ''Ferma la registrazione:''</font>
 +
  pl.Stop
 +
   pl.Close
 
   
 
   
  Wait MediaView1.Duration
+
   Print "Registrazione terminata"
 
 
   Print "File video creato !"
 
 
   
 
   
 
  End
 
  End
  
 +
===Catturare quanto accade visivamente in un programma esterno===
 +
Analogamente, si potrà riprendere in un file video "MP4", quanto accade visivamente in un programma esterno.
 +
<BR>Ovviamente alla Proprietà "xid" del plugin "ximagesrc" bisognerà passare il <U>numero identificativo della finestra</u> del programma esterno. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 +
 +
 +
=Creare un file video in formato "Matroska"=
 
===Catturare quanto mostrato sulla ''Scrivania''===
 
===Catturare quanto mostrato sulla ''Scrivania''===
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
Riga 258: Riga 266:
 
   mux = New MediaControl(pl, "matroskamux")  
 
   mux = New MediaControl(pl, "matroskamux")  
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "mkv" (Matroska):''</font>
+
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "MKV" (Matroska):''</font>
   snk["location"] = "/tmp/file.mkv"
+
   snk["location"] = "/tmp/video.mkv"
 
   
 
   
 
   src.LinkTo(cnv)
 
   src.LinkTo(cnv)
Riga 286: Riga 294:
  
 
===Catturare quanto avviene visivamente in un Oggetto grafico di Gambas===
 
===Catturare quanto avviene visivamente in un Oggetto grafico di Gambas===
In questo esempio registriamo in un video quanto avviene visivamente in un Oggetto grafico di Gambas, nel quale è posto anche un ''ValueBox''.
+
In questo esempio registriamo in un video quanto avviene visivamente in un Oggetto grafico di Gambas, ad esempio un ''ValueBox''.
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
 
   
 
   
Riga 303: Riga 311:
 
   mux = New MediaControl(pl, "matroskamux")  
 
   mux = New MediaControl(pl, "matroskamux")  
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "mkv" (Matroska):''</font>
+
  <FONT Color=gray>' ''Imposta il percorso del file video finale del formato "MKV" (Matroska):''</font>
   snk["location"] = "/tmp/file.mkv"
+
   snk["location"] = "/tmp/video.mkv"
 
   
 
   
 
   src.LinkTo(cnv)
 
   src.LinkTo(cnv)
Riga 337: Riga 345:
 
   
 
   
 
   Print "Registrazione Terminata"
 
   Print "Registrazione Terminata"
 +
 +
End
 +
 +
===Catturare quanto accade visivamente in un Controllo "MediaView"===
 +
Nel seguente esempio si cattureranno i dati video (<U>senza audio</u>) mostrati in un Controllo ''MediaView'', dai quali si creerà un file video, privo di audio, in formato Matroska (.mkv). <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
 +
<BR>Ai fini dell'esempio si dovrà utilizzare le Classi "MediaControl" e "MediaPipeline" del Componente gb.media
 +
<BR>Come già accennato nell'esempio precedente, il Controllo "MediaView" è composto da "Figli" e "Figli secondari" (...nipoti). Uno di questi "sub-Children" è una "DrawingArea", che in sostanza è l'Oggetto grafico <U>specifico</u> con cui il Controllo "MediaView" visualizza immagini e video.
 +
<BR>Identificheremo innanzitutto il numero identificativo di questa "DrawingArea", costitutiva del Controllo "MediaView", e con una particolare Proprietà del plugin "ximagesrc" cattureremo il video che essa mostra.
 +
Event Evento
 +
 +
 +
Public Sub Form_Open()
 +
 +
  Me.Show
 +
  Wait 0.1
 +
 +
  MediaView1.URL = "<FONT Color=darkgreen>''/percorso/del/media/da/catturare''</font>"
 +
 +
  Repeat
 +
    Wait 0.01
 +
  Until MediaView1.Position > 0.0
 +
 +
  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
 +
 
 +
<FONT Color=gray>' ''Una parte dell'ampia "famiglia" che compone il Controllo "MediaView":''</font>
 +
  ob = MediaView1.Children[0]
 +
  pn1 = ob.Children[0]
 +
  pn2 = pn1.Children[0]
 +
  DrawingArea1 = pn2.Children[0]
 +
 
 +
  pl = New MediaPipeline
 +
 
 +
  src = New MediaControl(pl, "ximagesrc")
 +
<FONT Color=gray>' ''Assegna alla proprietà "xid" del plugin "ximagesrc" il numero idetificativo della "DrawingArea", affinché catturi quanto da essa visualizzato:''</font>
 +
  src["xid"] = DrawingArea1.Id
 +
  cnv = New MediaControl(pl, "videoconvert")
 +
  enc = New MediaControl(pl, "x264enc")
 +
  mux = New MediaControl(pl, "matroskamux")
 +
  snk = New MediaControl(pl, "filesink")
 +
<FONT Color=gray>' ''Imposta il percorso del file video finale del formato "MKV" (Matroska):''</font>
 +
  snk["location"] = "/tmp/video.mkv"
 +
 
 +
<FONT Color=gray>' ''Collega i plugin di "GStreamer" utilizzati:''</font>
 +
  src.LinkTo(cnv)
 +
  cnv.LinkTo(enc)
 +
  enc.LinkTo(mux)
 +
  mux.LinkTo(snk)
 +
 +
  pl.play
 +
 +
  Wait MediaView1.Duration
 +
 
 +
  Print "File video creato !"
 
   
 
   
 
  End
 
  End
  
  
=Creare un file video in formato OGV-Theora=
+
=Creare un file video in formato "OGG-Theora"=
==Creare un video privo di audio==
+
==Creare un video <U>privo</u> di audio==
In questo paragrafo mostreremo alcuni esempi per generare un file video OGV, però <SPAN Style="text-decoration:underline">privo di audio</span>.
+
In questo paragrafo mostreremo alcuni esempi per generare un file video "OGG", però <U>privo di audio</u>.
  
 
In particolare di seguito mostriamo un esempio pratico, nel quale si cattureranno immagini di quanto accade sulla ''Scrivania'' e si produrrà con esse un file video OGV muto.
 
In particolare di seguito mostriamo un esempio pratico, nel quale si cattureranno immagini di quanto accade sulla ''Scrivania'' e si produrrà con esse un file video OGV muto.
Riga 365: Riga 437:
 
   mux = New MediaControl(pl, "oggmux")
 
   mux = New MediaControl(pl, "oggmux")
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
  <FONT Color=gray>' ''Si imposta il percorso del file video finale di formato .ogg:''</font>
+
  <FONT Color=gray>' ''Si imposta il percorso del file video finale di formato "OGG":''</font>
   snk["location"] = "/tmp/video.ogv"
+
   snk["location"] = "/tmp/video.ogg"
 
    
 
    
 
  <FONT Color=gray>' ''Si collegano fra loro i plugin di "GStreamer" sopra utilizzati:''</font>
 
  <FONT Color=gray>' ''Si collegano fra loro i plugin di "GStreamer" sopra utilizzati:''</font>
Riga 396: Riga 468:
 
  End
 
  End
  
Un'altra modalità, sempre con il fine di ottenere un video di formato "OGG" <SPAN Style="text-decoration:underline">privo di audio</span>, può essere quella in cui una prima fase vengono creati i file immagine in formato .png, che rappresentano vari ''screenshot'' della finestra del programma prescelto, e in una seconda fase si genera da tali molteplici file immagine il vero e proprio file video di formato "OGG".
+
Un'altra modalità, sempre con il fine di ottenere un video di formato "OGG" <U>privo di audio</u>, può essere quella in cui una prima fase vengono creati i file immagine in formato .png, che rappresentano vari ''screenshot'' della finestra del programma prescelto, e in una seconda fase si genera da tali molteplici file immagine il vero e proprio file video di formato "OGG".
 
<BR>Va precisato che le schermate rappresenteranno esclusivamente quanto accade "all'interno" della finestra aperta prescelta. Pertanto, qualora un'altra finestra o un'altro elemento grafico presente sulla Scrivania dovesse coprire in tutto o in parte la finestra prescelta per gli ''screenshot'', essi non saranno registrati nelle schermate, e pertanto non appariranno nel video finale.
 
<BR>Va precisato che le schermate rappresenteranno esclusivamente quanto accade "all'interno" della finestra aperta prescelta. Pertanto, qualora un'altra finestra o un'altro elemento grafico presente sulla Scrivania dovesse coprire in tutto o in parte la finestra prescelta per gli ''screenshot'', essi non saranno registrati nelle schermate, e pertanto non appariranno nel video finale.
  
E' necessario attivare, oltre ovviamente al Componente ''gb.media'', anche i Componenti "''gb.desktop''" e "''gb.desktop.x11''".
+
E' necessario attivare, oltre ovviamente al Componente ''gb.media'', anche i Componenti ''gb.desktop'' e ''gb.desktop.x11''.
  
 
Nell'esempio, che segue, faremo gli ''screenshot'' ed il successivo video OGG di quanto accade esclusivamente "all'interno" della finestra aperta di un Terminale.
 
Nell'esempio, che segue, faremo gli ''screenshot'' ed il successivo video OGG di quanto accade esclusivamente "all'interno" della finestra aperta di un Terminale.
Riga 510: Riga 582:
 
  End
 
  End
  
Nella seguente terza modalità si utilizzerà il Componente ''gb.media'' soltanto nella seconda fase, ossia quella in cui viene generato il file video ".ogv".
+
Nella seguente terza modalità si utilizzerà il Componente ''gb.media'' soltanto nella seconda fase, ossia quella in cui viene generato il file video "OGG".
 
<BR>Bisognerà comunque attivare anche i Componenti ''gb.desktop'' e ''gb.desktop.x11'', che permetteranno di utilizzare il Metodo ".GetScreenshot()" della Classe ''DesktopWindow'', per ottenere gli ''screenshot'' della finestra prescelta.
 
<BR>Bisognerà comunque attivare anche i Componenti ''gb.desktop'' e ''gb.desktop.x11'', che permetteranno di utilizzare il Metodo ".GetScreenshot()" della Classe ''DesktopWindow'', per ottenere gli ''screenshot'' della finestra prescelta.
  
Riga 606: Riga 678:
 
   pl.Play()
 
   pl.Play()
 
    
 
    
 +
End
 +
 +
====Esempio a ''riga di comando''====
 +
Private bo As Boolean
 +
 +
 +
Public Sub Main()
 +
 +
  Dim pl As MediaPipeline
 +
  Dim src, cnv, enc, mux, snk As MediaControl
 +
  Dim flt As MediaFilter
 +
  Dim tm As Date
 +
  Dim i As Integer
 +
 +
  If Exist("/tmp/video.ogg") Then Kill "/tmp/video.ogg"
 +
 +
  pl = New MediaPipeline
 +
 +
  src = New MediaControl(pl, "ximagesrc")
 +
<FONT Color=gray>' ''Assegna alla proprietà "xid" il numero identificativo della finestra da registrare (0 è lo schermo):''</font>
 +
  src["xid"] = 0
 +
  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")
 +
  snk["location"] = "/tmp/video.ogg"
 +
  snk["sync"] = False
 +
 
 +
<FONT Color=gray>' ''Collega fra loro i plugin di "GStreamer":''</font>
 +
  src.LinkTo(cnv)
 +
  cnv.LinkTo(flt)
 +
  flt.LinkTo(enc)
 +
  enc.LinkTo(mux)
 +
  mux.LinkTo(snk)
 +
 +
<FONT Color=gray>' ''Avvia la registrazione video:''</font>
 +
  pl.Play()
 +
 +
  tm = Now
 +
 +
  Repeat
 +
    i = DateDiff(tm, Now, gb.Millisecond)
 +
<FONT Color=gray>' ''Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:''</font>
 +
    Write "\rTempo: " & Str(Time(0, 0, 0, i))
 +
    Wait 0.01
 +
  Until bo
 +
 +
  pl.Stop()
 +
  pl.Close()
 +
  Print "\nRegistrazione terminata !"
 +
 +
<FONT Color=gray>' ''Avendo usato l'Evento "Application_Read()", per terminare l'applicazione, è necessario usare il comando "Quit":''</font>
 +
  Quit
 +
 +
End
 +
 +
 +
Public Sub Application_Read()  ' Cliccando sui tasti "Invio" dela tastiera, viene sollevato questo Evento
 +
 +
  bo = True
 +
 
  End
 
  End
  
  
==Creare un video comprensivo di audio==
+
==Creare un video <U>comprensivo</u> di audio==
In questo paragrafo mostreremo un esempio per generare un file video OGV comprensivo di audio, registrato contemporaneamente al video mediante ad esempio un microfono.
+
In questo paragrafo mostreremo un esempio per generare un file video "OGG" <U>comprensivo di audio</u>, registrato contemporaneamente al video mediante, ad esempio, un microfono.
  
 
Va sottolineato che dopo aver premuto il tasto di avvio della registrazione audio-video, se si sta registrando quanto accade nella finestra di un programma (e dunque non della Scrivania), bisognerà porre come finestra attiva quella del programma interessato (ad esempio con il mouse oppure via codice). Medesima attenzione bisognerà prestare subito dopo aver arrestato la registrazione.
 
Va sottolineato che dopo aver premuto il tasto di avvio della registrazione audio-video, se si sta registrando quanto accade nella finestra di un programma (e dunque non della Scrivania), bisognerà porre come finestra attiva quella del programma interessato (ad esempio con il mouse oppure via codice). Medesima attenzione bisognerà prestare subito dopo aver arrestato la registrazione.
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
Private temporaneo as String
 
 
   
 
   
 
   
 
   
Riga 621: Riga 754:
 
   Dim srcv, vcon, que1, the, que2, srca, que3, acon, vor, que4, ogg, snk As MediaControl
 
   Dim srcv, vcon, que1, the, que2, srca, que3, acon, vor, que4, ogg, snk As MediaControl
 
   Dim flv, fla As MediaFilter
 
   Dim flv, fla As MediaFilter
 
+
  temporaneo = Temp
 
 
 
 
   pl = New MediaPipeline  
 
   pl = New MediaPipeline  
 
+
 
   srcv = New MediaControl(pl, "ximagesrc")
 
   srcv = New MediaControl(pl, "ximagesrc")
 
  <FONT Color=gray>' ''Si assegna alla proprietà "xid" il numero identificativo della finestra da registrare:''</font>
 
  <FONT Color=gray>' ''Si assegna alla proprietà "xid" il numero identificativo della finestra da registrare:''</font>
 
   srcv["xid"] = <FONT Color=gray>''numero_identificativo_della_finestra''</font>
 
   srcv["xid"] = <FONT Color=gray>''numero_identificativo_della_finestra''</font>
 
  <FONT Color=gray>' ''La cattura avviene con 2 frame al secondo:''</font>
 
  <FONT Color=gray>' ''La cattura avviene con 2 frame al secondo:''</font>
   flv = New MediaFilter(pl, "video/x-raw,framerate=2/1")
+
   flv = New MediaFilter(pl, "video/x-raw,framerate=32/1")
 
   vcon = New MediaControl(pl, "videoconvert")
 
   vcon = New MediaControl(pl, "videoconvert")
 
   que1 = New MediaControl(pl, "queue")
 
   que1 = New MediaControl(pl, "queue")
Riga 643: Riga 774:
 
   ogg = New MediaControl(pl, "oggmux")
 
   ogg = New MediaControl(pl, "oggmux")
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
   snk["location"] = temporaneo
+
   snk["location"] = "/tmp/video.ogg"
   
+
 
  <FONT Color=gray>' ''Parte video:''</font>
 
  <FONT Color=gray>' ''Parte video:''</font>
 
   srcv.LinkTo(flv)
 
   srcv.LinkTo(flv)
Riga 652: Riga 783:
 
   the.LinkTo(que2)
 
   the.LinkTo(que2)
 
   que2.LinkTo(ogg)
 
   que2.LinkTo(ogg)
 +
 
  <FONT Color=gray>' ''Parte audio:''</font>
 
  <FONT Color=gray>' ''Parte audio:''</font>
 
   srca.LinkTo(fla)
 
   srca.LinkTo(fla)
Riga 658: Riga 790:
 
   acon.LinkTo(vor)
 
   acon.LinkTo(vor)
 
   vor.LinkTo(que4)
 
   vor.LinkTo(que4)
 +
 
  <FONT Color=gray>' ''Combinazione dei dati audio e video:''</font>
 
  <FONT Color=gray>' ''Combinazione dei dati audio e video:''</font>
 
   que4.LinkTo(ogg)
 
   que4.LinkTo(ogg)
 +
 
  <FONT Color=gray>' ''Creazione del file .ogv finale:''</font>
 
  <FONT Color=gray>' ''Creazione del file .ogv finale:''</font>
 
   ogg.LinkTo(snk)
 
   ogg.LinkTo(snk)
Riga 683: Riga 817:
 
    
 
    
 
   Desktop.ActiveWindow = <FONT Color=gray>''numero_identificativo_della_finestra''</font>
 
   Desktop.ActiveWindow = <FONT Color=gray>''numero_identificativo_della_finestra''</font>
   Copy temporaneo To "/tmp/video.ogv"
+
    
 
   Print "Registrazione fermata"
 
   Print "Registrazione fermata"
 
   Me.close
 
   Me.close
Riga 692: Riga 826:
 
Vediamo ora un esempio con un'applicazione ''a riga di comando''.
 
Vediamo ora un esempio con un'applicazione ''a riga di comando''.
  
Anche in questo caso bisognerà avere cura di porre come finestra ''attiva'' quella del programma interessato sia dopo l'avvio che dopo l'arresto della registrazione video-audio). Per fare ciò, pur in assenza di ambiente grafico, si potrà comunque attivare il Componente grafico (ad esempio) ''gb.gtk'' (meglio non utilizzare le risorse di ''QT'', per non incorrere in eventuali incompatibilità fra le risorse di ''GSreamer'' e ''QT''), il quale permetterà di attivare anche il Componente ''gb.desktop'' per il successivo uso della proprietà "''ActiveWindow''".
+
Anche in questo caso bisognerà avere cura di porre come finestra ''attiva'' quella del programma (di Gambas o esterno) interessato sia dopo l'avvio che dopo l'arresto della registrazione video-audio). Per fare ciò, pur in assenza di ambiente grafico, si potrà comunque attivare il Componente grafico (ad esempio) ''gb.gtk3'' (meglio non utilizzare le risorse di ''QT'', per non incorrere in eventuali incompatibilità fra le risorse di ''GSreamer'' e ''QT''), il quale permetterà di attivare anche il Componente ''gb.desktop'' per il successivo uso della Proprietà ".ActiveWindow".
 +
Private Const FINESTRA_PROGRAMMA As Integer = <FONT Color=gray>''numero_identificativo_della_finestra''</font>
 
  Private bo As Boolean
 
  Private bo As Boolean
 
   
 
   
Riga 701: Riga 836:
 
   Dim srcv, vcon, que1, the, que2, srca, que3, acon, vor, que4, ogg, snk As MediaControl
 
   Dim srcv, vcon, que1, the, que2, srca, que3, acon, vor, que4, ogg, snk As MediaControl
 
   Dim flv, fla As MediaFilter
 
   Dim flv, fla As MediaFilter
  Dim temporaneo As String
+
   
 
  temporaneo = Temp
 
   
 
 
   pl = New MediaPipeline  
 
   pl = New MediaPipeline  
 
    
 
    
 
   srcv = New MediaControl(pl, "ximagesrc")
 
   srcv = New MediaControl(pl, "ximagesrc")
   srcv["xid"] = &05600006
+
   srcv["xid"] = FINESTRA_PROGRAMMA
   flv = New MediaFilter(pl, "video/x-raw,framerate=2/1")
+
   flv = New MediaFilter(pl, "video/x-raw,framerate=32/1")
 
   vcon = New MediaControl(pl, "videoconvert")
 
   vcon = New MediaControl(pl, "videoconvert")
 
   que1 = New MediaControl(pl, "queue")
 
   que1 = New MediaControl(pl, "queue")
Riga 722: Riga 854:
 
   ogg = New MediaControl(pl, "oggmux")
 
   ogg = New MediaControl(pl, "oggmux")
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
   snk["location"] = temporaneo
+
   snk["location"] = "/tmp/video.ogg"
 
      
 
      
 
  <FONT Color=gray>' ''Parte video:''</font>
 
  <FONT Color=gray>' ''Parte video:''</font>
Riga 731: Riga 863:
 
   the.LinkTo(que2)
 
   the.LinkTo(que2)
 
   que2.LinkTo(ogg)
 
   que2.LinkTo(ogg)
 +
 
  <FONT Color=gray>' ''Parte audio:''</font>
 
  <FONT Color=gray>' ''Parte audio:''</font>
 
   srca.LinkTo(fla)
 
   srca.LinkTo(fla)
Riga 737: Riga 870:
 
   acon.LinkTo(vor)
 
   acon.LinkTo(vor)
 
   vor.LinkTo(que4)
 
   vor.LinkTo(que4)
 +
 
  <FONT Color=gray>' ''Combinazione dei dati audio e video:''</font>
 
  <FONT Color=gray>' ''Combinazione dei dati audio e video:''</font>
 
   que4.LinkTo(ogg)
 
   que4.LinkTo(ogg)
 +
 
  <FONT Color=gray>' ''Creazione del file .ogv finale:''</font>
 
  <FONT Color=gray>' ''Creazione del file .ogv finale:''</font>
 
   ogg.LinkTo(snk)
 
   ogg.LinkTo(snk)
Riga 746: Riga 881:
 
    
 
    
 
  <FONT Color=gray>' ''Pone come attiva la finestra del programma prescelto:''</font>
 
  <FONT Color=gray>' ''Pone come attiva la finestra del programma prescelto:''</font>
   Desktop.ActiveWindow = <FONT Color=gray>''numero_identificativo_della_finestra''</font>
+
   Desktop.ActiveWindow = FINESTRA_PROGRAMMA
 
    
 
    
   Repeat
+
   While Not bo
 
  <FONT Color=gray>' ''Mostra in console/terminale il tempo trascorso dall'inizio della ripresa audio-video:''</font>
 
  <FONT Color=gray>' ''Mostra in console/terminale il tempo trascorso dall'inizio della ripresa audio-video:''</font>
     Write #File.Out, "\rTempo: " & Time(0, 0, 0, pl.Position * 1000)
+
     Write "\rTempo: " & Time(0, 0, 0, pl.Position * 1000)
 
     Wait 0.01
 
     Wait 0.01
   Until bo = True
+
   Wend
 
    
 
    
  <FONT Color=gray>' ''Pone nuovamente come attiva la finestra del programma prescelto:''</font>
+
  <FONT Color=gray>' ''Pone <U>nuovamente</u> come attiva la finestra del programma prescelto:''</font>
   Desktop.ActiveWindow = <FONT Color=gray>''numero_identificativo_della_finestra''</font>
+
   Desktop.ActiveWindow = FINESTRA_PROGRAMMA
 
    
 
    
 
   pl.Stop()
 
   pl.Stop()
 
   pl.Close()
 
   pl.Close()
  Copy temporaneo To "/tmp/prova.ogv"
+
 
 
 
   Print "Termine registrazione"
 
   Print "Termine registrazione"
 
   Quit
 
   Quit
Riga 772: Riga 906:
 
    
 
    
 
  End
 
  End
 +
 +
 +
=Creare un file video in formato "FLV"=
 +
===Catturare quanto mostrato sulla ''Scrivania''===
 +
Private pl As MediaPipeline
 +
 +
 +
Public Sub Form_Open()
 +
 +
  Dim src, cnv, enc, mux, snk As MediaControl
 +
 +
  pl = New MediaPipeline
 +
 +
  src = New MediaControl(pl, "ximagesrc")
 +
<FONT Color=gray>' ''Assegna alla proprietà "xid" del plugin "ximagesrc" il numero idetificativo della "Scrivania", affinché catturi quanto da essa visualizzato:''</font>
 +
  src["xid"] = 0
 +
  cnv = New MediaControl(pl, "videoconvert")
 +
  enc = New MediaControl(pl, "x264enc")
 +
  enc["pass"] = 5
 +
  enc["quantizer"] = 26
 +
  enc["speed-preset"] = 6
 +
  mux = New MediaControl(pl, "flvmux")
 +
  snk = New MediaControl(pl, "filesink")
 +
<FONT Color=gray>' ''Imposta il percorso del file video finale del formato "fLV":''</font>
 +
  snk["location"] = "/tmp/video.flv"
 +
 +
  src.LinkTo(cnv)
 +
  cnv.LinkTo(enc)
 +
  enc.LinkTo(mux)
 +
  mux.LinkTo(snk)
 +
 +
End
 +
 +
Public Sub Button1_Click()
 +
 
 +
<FONT Color=gray>' ''Avvia la ripresa video:''</font>
 +
  pl.Play()
 +
 
 +
End
 +
 +
Public Sub Button2_Click()
 +
 +
<FONT Color=gray>' ''Ferma la registrazione:''</font>
 +
  pl.Stop
 +
  pl.Close
 +
 +
  Print "Registrazione Terminata"
 +
 +
End
 +
 +
===Catturare quanto avviene visivamente in un Oggetto grafico di Gambas===
 +
In questo esempio registriamo in un video quanto avviene visivamente in un Oggetto grafico di Gambas, ad esempio un ''ValueBox''.
 +
Private pl As MediaPipeline
 +
 +
 +
Public Sub Form_Open()
 +
 +
  Dim src, cnv, enc, mux, snk As MediaControl
 +
 +
  pl = New MediaPipeline
 +
 +
  src = New MediaControl(pl, "ximagesrc")
 +
<FONT Color=gray>' ''Assegna alla proprietà "xid" del plugin "ximagesrc" il numero identificativo del "ValueBox", affinché catturi quanto da essa visualizzato:''</font>
 +
  src["xid"] = ValueBox1.Id
 +
  cnv = New MediaControl(pl, "videoconvert")
 +
  enc = New MediaControl(pl, "x264enc")
 +
  mux = New MediaControl(pl, "matroskamux")
 +
  snk = New MediaControl(pl, "filesink")
 +
<FONT Color=gray>' ''Imposta il percorso del file video finale del formato "FLV":''</font>
 +
  snk["location"] = "/tmp/video.flv"
 +
 +
  src.LinkTo(cnv)
 +
  cnv.LinkTo(enc)
 +
  enc.LinkTo(mux)
 +
  mux.LinkTo(snk)
 +
 +
End
 +
 +
 +
Public Sub Button1_Click()
 +
 +
  Dim c As Short = 100
 +
 +
<FONT Color=gray>' ''Avvia la ripresa video:''</font>
 +
  pl.Play()
 +
 +
  Repeat
 +
    Dec c
 +
    ValueBox1.Value = c
 +
    Wait 0.01
 +
  Until c == 0
 +
 +
End
 +
 +
 +
Public Sub Button2_Click()
 +
 +
<FONT Color=gray>' ''Ferma la registrazione:''</font>
 +
  pl.Stop
 +
  pl.Close
 +
 +
  Print "Registrazione Terminata"
 +
 +
End
 +
 +
 +
=Creare un file video in formato "AVI"=
 +
===Catturare quanto mostrato sulla ''Scrivania''===
 +
Private pl As MediaPipeline
 +
 +
 +
Public Sub Form_Open()
 +
 +
  Dim src, cnv, mux, snk As MediaControl
 +
 +
  pl = New MediaPipeline
 +
 +
  src = New MediaControl(pl, "ximagesrc")
 +
<FONT Color=gray>' ''Assegna alla proprietà "xid" del plugin "ximagesrc" il numero idetificativo della "Scrivania", affinché catturi quanto da essa visualizzato:''</font>
 +
  src["xid"] = 0
 +
  cnv = New MediaControl(pl, "videoconvert")
 +
  mux = New MediaControl(pl, "avimux")
 +
  snk = New MediaControl(pl, "filesink")
 +
<FONT Color=gray>' ''Imposta il percorso del file video finale del formato "AVI":''</font>
 +
  snk["location"] = "/tmp/video.avi"
 +
 +
  src.LinkTo(cnv)
 +
  cnv.LinkTo(mux)
 +
  mux.LinkTo(snk)
 +
 +
End
 +
 +
Public Sub Button1_Click()
 +
 
 +
<FONT Color=gray>' ''Avvia la ripresa video:''</font>
 +
  pl.Play()
 +
 
 +
End
 +
 +
Public Sub Button2_Click()
 +
 +
<FONT Color=gray>' ''Ferma la registrazione:''</font>
 +
  pl.Stop
 +
  pl.Close
 +
 +
  Print "Registrazione Terminata"
 +
 +
End
 +
 +
===Catturare quanto avviene visivamente in un Oggetto grafico di Gambas===
 +
In questo esempio registriamo in un video quanto avviene visivamente in un Oggetto grafico di Gambas, ad esempio un ''ValueBox''.
 +
Private pl As MediaPipeline
 +
 +
 +
Public Sub Form_Open()
 +
 +
  Dim src, cnv, mux, snk As MediaControl
 +
 +
  pl = New MediaPipeline
 +
 +
  src = New MediaControl(pl, "ximagesrc")
 +
<FONT Color=gray>' ''Assegna alla proprietà "xid" del plugin "ximagesrc" il numero identificativo del "ValueBox", affinché catturi quanto da essa visualizzato:''</font>
 +
  src["xid"] = ValueBox1.Id
 +
  cnv = New MediaControl(pl, "videoconvert")
 +
  mux = New MediaControl(pl, "avimux")
 +
  snk = New MediaControl(pl, "filesink")
 +
<FONT Color=gray>' ''Imposta il percorso del file video finale del formato "FLV":''</font>
 +
  snk["location"] = "/tmp/video.avi"
 +
 +
  src.LinkTo(cnv)
 +
  cnv.LinkTo(mux)
 +
  mux.LinkTo(snk)
 +
 +
End
 +
 +
 +
Public Sub Button1_Click()
 +
 +
  Dim c As Short = 100
 +
 +
<FONT Color=gray>' ''Avvia la ripresa video:''</font>
 +
  pl.Play()
 +
 +
  Repeat
 +
    Dec c
 +
    ValueBox1.Value = c
 +
    Wait 0.01
 +
  Until c == 0
 +
 +
End
 +
 +
 +
Public Sub Button2_Click()
 +
 +
<FONT Color=gray>' ''Ferma la registrazione:''</font>
 +
  pl.Stop
 +
  pl.Close
 +
 +
  Print "Registrazione Terminata"
 +
 +
End
 +
 +
 +
 +
=Note=
 +
[1] Sulla individuazione dell'ID della finestra di un programma vedere le seguenti pagine:
 +
* [[Individuare ed estrarre l'ID della finestra di un programma]]
 +
* [[Individuare ID e nome delle finestre attive con le risorse del Componente gb.desktop]]
 +
* [[Individuare ID e nome delle finestre attive, nonché il PID dei loro programmi con le risorse del Componente gb.desktop.x11]]
 +
 +
[2] Vedere anche la seguente pagina della wiki: [[Catturare il video riprodotto in un Controllo MediaView del componente gb.media]]

Versione attuale delle 19:48, 12 lug 2024

Con le risorse del Componente "gb.media" è possibile catturare immagini di quanto avviene in una finestra di un programma di Gambas o esterno e farne un file video.

Va detto che questa possibilità di registrazione video è estesa ovviamente anche alla Scrivania (Desktop), e che in tal caso sarà catturato anche il puntatore del mouse.

Per individuare la finestra, che si intende registrare, bisognerà passare alla Proprietà "xid" del MediaControl "ximagesrc" il numero identificativo della finestra medesima. [nota 1]
Per la Scrivania è anche possibile impostare più semplicemente il suo ID di default uguale a 0 (zero).

Se si intende creare un file video di ciò che avviene in un Controllo grafico di Gambas, si passerà alla Proprietà "xid" del MediaControl "ximagesrc" semplicemente il numero identificativo di detto Oggetto grafico.

Creare un file video in formato "MP4"

Catturare quanto accade visivamente sulla Scrivania

Nel seguente esempio si cattureranno i dati video (senza audio) di quanto accade visivamente sulla Scrivania, dai quali si creerà un file video, privo di audio, in formato MP4.

Private pl As MediaPipeline


Public Sub Form_Open()

 Dim src, cnv, enc, mux, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "ximagesrc")
' Assegna alla proprietà "xid" del plugin "ximagesrc" il numero identificativo (zero) della "Scrivania", affinché catturi quanto in essa visualizzato:
 src["xid"] = 0
 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 video finale del formato "MP4":
 snk["location"] = "/tmp/video.mp4"

' Collega i plugin di "GStreamer" utilizzati:
 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

End

Public Sub Button1_Click()
  
' Avvia la ripresa video:
 pl.Play()

End

Public Sub Button2_Click()

' Ferma la registrazione:
 pl.Stop
 pl.Close

 Print "Registrazione terminata"

End

Catturare quanto avviene visivamente in un Oggetto grafico di Gambas

In questo esempio registriamo in un video quanto avviene visivamente in un Oggetto grafico di Gambas, ad esempio un ValueBox.

Private pl As MediaPipeline


Public Sub Form_Open()

 Dim src, cnv, enc, mux, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "ximagesrc")
' Assegna alla proprietà "xid" del plugin "ximagesrc" il numero identificativo del "ValueBox", affinché catturi quanto da essa visualizzato:
 src["xid"] = ValueBox1.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 video finale del formato "MP4":
 snk["location"] = "/tmp/video.mp4"

 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

End


Public Sub Button1_Click()

 Dim c As Short = 100

' Avvia la ripresa video:
 pl.Play()

 Repeat 
   Dec c
   ValueBox1.Value = c
   Wait 0.01
 Until c == 0

End


Public Sub Button2_Click()

' Ferma la registrazione:
 pl.Stop
 pl.Close

 Print "Registrazione Terminata"

End

Catturare quanto accade visivamente in un Controllo "MediaView"

Nel seguente esempio si cattureranno i dati video (senza audio) di quanto accade visivamente su un intero Controllo MediaView, dai quali si creerà un file video, privo di audio, in formato MP4. [nota 2]

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
Private pl As MediaPipeline


Public Sub Form_Open()

 Dim src, cnv, enc, mux, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "ximagesrc")
' Assegna alla Proprietà "xid" del plugin "ximagesrc" il numero identificativo del Controllo "MediaView", affinché catturi quanto sull'intero Controllo è visualizzato:
 src["xid"] = MediaView1.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 video finale del formato "MP4":
 snk["location"] = "/tmp/video.mp4"

' Collega i plugin di "GStreamer" utilizzati:
 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

 MediaView1.URL = Media.URL("/percorso/del/file/video)

End

Public Sub Button1_Click()
  
' Avvia la ripresa video:
 pl.Play()

End

Public Sub Button2_Click()

' Ferma la registrazione:
 pl.Stop
 pl.Close

 Print "Registrazione terminata"

End

Catturare quanto mostrato nella sola e specifica area video di un Controllo "MediaView"

Nel seguente esempio si cattureranno i dati video (senza audio) di quanto mostrato nella sola e specifica area video di un Controllo MediaView, dai quali si creerà un file video, privo di audio, in formato MP4.
In particolare il video viene mostrato in una DrawingArea, posta all'interno di un Oggetto grafico Panel, a sua volta Figlio del Controllo MediaView. Bisognerà pertanto individuare e gestire tale DrawingArea.
Ciò sta a significare anche che è possibile creare dati video di quanto avviene in un Oggetto grafico di Gambas.

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
Private pl As MediaPipeline


Public Sub Form_Open()

 Dim src, cnv, enc, mux, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "ximagesrc")
' Individua e poi assegna alla Proprietà "xid" del plugin "ximagesrc" il numero identificativo della "DrawingArea, affinché catturi quanto mostrato nella sola e specifica area video del Controllo "MediView":
 Dim ob As Object
 Dim pn As Panel
 Dim DrawingArea1 as DrawingArea
 ob = MediaView1.Children[0]
 pn = ob.Children[0]
 DrawingArea1 = pn.Children[0]
 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 video finale del formato "MP4":
 snk["location"] = "/tmp/video.mp4"

' Collega i plugin di "GStreamer" utilizzati:
 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

 MediaView1.URL = Media.URL("/percorso/del/file/video)

End

Public Sub Button1_Click()
  
' Avvia la ripresa video:
 pl.Play()

End

Public Sub Button2_Click()

' Ferma la registrazione:
 pl.Stop
 pl.Close

 Print "Registrazione terminata"

End

Catturare quanto accade visivamente in un programma esterno

Analogamente, si potrà riprendere in un file video "MP4", quanto accade visivamente in un programma esterno.
Ovviamente alla Proprietà "xid" del plugin "ximagesrc" bisognerà passare il numero identificativo della finestra del programma esterno. [nota 1]


Creare un file video in formato "Matroska"

Catturare quanto mostrato sulla Scrivania

Private pl As MediaPipeline


Public Sub Form_Open()

 Dim src, cnv, enc, mux, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "ximagesrc")
' Assegna alla proprietà "xid" del plugin "ximagesrc" il numero idetificativo della "Scrivania", affinché catturi quanto da essa visualizzato:
 src["xid"] = 0
 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 video finale del formato "MKV" (Matroska):
 snk["location"] = "/tmp/video.mkv"

 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

End

Public Sub Button1_Click()
  
' Avvia la ripresa video:
 pl.Play()
 
End

Public Sub Button2_Click()

' Ferma la registrazione:
 pl.Stop
 pl.Close

 Print "Registrazione Terminata"

End

Catturare quanto avviene visivamente in un Oggetto grafico di Gambas

In questo esempio registriamo in un video quanto avviene visivamente in un Oggetto grafico di Gambas, ad esempio un ValueBox.

Private pl As MediaPipeline


Public Sub Form_Open()

 Dim src, cnv, enc, mux, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "ximagesrc")
' Assegna alla proprietà "xid" del plugin "ximagesrc" il numero identificativo del "ValueBox", affinché catturi quanto da essa visualizzato:
 src["xid"] = ValueBox1.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 video finale del formato "MKV" (Matroska):
 snk["location"] = "/tmp/video.mkv"

 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

End


Public Sub Button1_Click()

 Dim c As Short = 100

' Avvia la ripresa video:
 pl.Play()

 Repeat 
   Dec c
   ValueBox1.Value = c
   Wait 0.01
 Until c == 0

End


Public Sub Button2_Click()

' Ferma la registrazione:
 pl.Stop
 pl.Close

 Print "Registrazione Terminata"

End

Catturare quanto accade visivamente in un Controllo "MediaView"

Nel seguente esempio si cattureranno i dati video (senza audio) mostrati in un Controllo MediaView, dai quali si creerà un file video, privo di audio, in formato Matroska (.mkv). [nota 2]
Ai fini dell'esempio si dovrà utilizzare le Classi "MediaControl" e "MediaPipeline" del Componente gb.media
Come già accennato nell'esempio precedente, il Controllo "MediaView" è composto da "Figli" e "Figli secondari" (...nipoti). Uno di questi "sub-Children" è una "DrawingArea", che in sostanza è l'Oggetto grafico specifico con cui il Controllo "MediaView" visualizza immagini e video.
Identificheremo innanzitutto il numero identificativo di questa "DrawingArea", costitutiva del Controllo "MediaView", e con una particolare Proprietà del plugin "ximagesrc" cattureremo il video che essa mostra.

Event Evento


Public Sub Form_Open()

 Me.Show
 Wait 0.1

 MediaView1.URL = "/percorso/del/media/da/catturare"

 Repeat 
    Wait 0.01
 Until MediaView1.Position > 0.0

 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
 
' Una parte dell'ampia "famiglia" che compone il 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" del plugin "ximagesrc" il numero idetificativo della "DrawingArea", affinché catturi quanto da essa visualizzato:
 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 video finale del formato "MKV" (Matroska):
 snk["location"] = "/tmp/video.mkv"
  
' Collega i plugin di "GStreamer" utilizzati:
 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

 pl.play

 Wait MediaView1.Duration
 
 Print "File video creato !"

End


Creare un file video in formato "OGG-Theora"

Creare un video privo di audio

In questo paragrafo mostreremo alcuni esempi per generare un file video "OGG", però privo di audio.

In particolare di seguito mostriamo un esempio pratico, nel quale si cattureranno immagini di quanto accade sulla Scrivania e si produrrà con esse un file video OGV muto.

Private pl As MediaPipeline


Public Sub Form_Open()
 
  Dim src, cnv, enc, mux, snk As MediaControl
  Dim ftr As MediaFilter

  pl = New MediaPipeline 
  
  src = New MediaControl(pl, "ximagesrc")
' Si assegna alla proprietà "xid" il numero identificativo della finestra (in questo caso la "Scrivania") da registrare:
  src["xid"] = 0
' La cattura avviene con 1 frame al secondo:
  ftr = New MediaFilter(pl, "video/x-raw,framerate=4/1")
  cnv = New MediaControl(pl, "videoconvert")
  enc = New MediaControl(pl, "theoraenc")
  mux = New MediaControl(pl, "oggmux")
  snk = New MediaControl(pl, "filesink")
' Si imposta il percorso del file video finale di formato "OGG":
  snk["location"] = "/tmp/video.ogg"
  
' Si collegano fra loro i plugin di "GStreamer" sopra utilizzati:
  src.LinkTo(ftr)
  ftr.LinkTo(cnv)
  cnv.LinkTo(enc)
  enc.LinkTo(mux)
  mux.LinkTo(snk)
  
End


Public Sub Button1_Click()
   
' Avvia la ripresa video:
 pl.Play()

End


Public Sub Button2_Click()
 
' Ferma la registrazione:
 pl.Stop
 pl.Close
 
 Print "Registrazione fermata"
  
End

Un'altra modalità, sempre con il fine di ottenere un video di formato "OGG" privo di audio, può essere quella in cui una prima fase vengono creati i file immagine in formato .png, che rappresentano vari screenshot della finestra del programma prescelto, e in una seconda fase si genera da tali molteplici file immagine il vero e proprio file video di formato "OGG".
Va precisato che le schermate rappresenteranno esclusivamente quanto accade "all'interno" della finestra aperta prescelta. Pertanto, qualora un'altra finestra o un'altro elemento grafico presente sulla Scrivania dovesse coprire in tutto o in parte la finestra prescelta per gli screenshot, essi non saranno registrati nelle schermate, e pertanto non appariranno nel video finale.

E' necessario attivare, oltre ovviamente al Componente gb.media, anche i Componenti gb.desktop e gb.desktop.x11.

Nell'esempio, che segue, faremo gli screenshot ed il successivo video OGG di quanto accade esclusivamente "all'interno" della finestra aperta di un Terminale.

Private pl As MediaPipeline


Public Sub Form_Open()
 
  Dim wid As Integer
  Dim src, sca, con, png, snk As MediaControl
  Dim flt As MediaFilter

' Innanzitutto verifica l'esistenza della Cartella, ove verranno salvati i file immagini delle schermate. Se non esiste, la crea.
  If Not Exist("/tmp/VIDEO") Then Mkdir "/tmp/VIDEO"
 
' Passa il nome visibile della finestra prescelta e ne individua il numero identificativo:
  wid = ID_Finestra("Terminal")
  
  pl = New MediaPipeline
  
  src = New MediaControl(pl, "ximagesrc")
' Imposta l'angolo x in alto a sinistra della schermata rispetto alla superficie del Terminale:
  src["startx"] = 0
  src["use-damage"] = 0
  src["xid"] = wid
  sca = New MediaControl(pl, "videoscale")
  sca["method"] = 0
' Imposta la dimensione del file immagine finale, nonché il valore di 4 fotogrammi al secondo:
  flt = New MediaFilter(pl, "video/x-raw,width=640,height=480,framerate=4/1")
  con = New MediaControl(pl, "videoconvert")
  png = New MediaControl(pl, "pngenc")
  snk = New MediaControl(pl, "multifilesink")
  snk["location"] = "/tmp/VIDEO/fotogramma%01d.png" 
  
' Vengono collegati i vari plug-in di GStreamer utilizzati:
  src.LinkTo(sca)
  sca.LinkTo(flt)
  flt.LinkTo(con)
  con.LinkTo(png)
  png.LinkTo(snk)
  
End


Public Sub Button1_Click()
 
' Effettua le schermate:
  pl.Play()
  
End


Public Sub Button2_Click()
 
' Chiude il flusso arrestando la produzione delle schermate:
  pl.Stop()
  pl.Close()

  Genera_Video()
 
End


Private Function ID_Finestra(titolo As String) As Integer
 
  Dim i As Integer
 
  i = Desktop.FindWindow(titolo, Null, Null)[0]
  
  Return i
  
End


Private Procedure Genera_Video()
 
  Dim src, png, con, rat, thr, mux, snk As MediaControl
 
  pl = New MediaPipeline
  
  src = New MediaControl(pl, "multifilesrc")
  src["location"] = "/tmp/VIDEO/fotogramma%01d.png"
  src["index"] = 0
' Imposta il valore di 4 fotogrammi al secondo:
  src["caps"] = "image/png,framerate=4/1"
  png = New MediaControl(pl, "pngdec")
  con = New MediaControl(pl, "videoconvert")
  rat = New MediaControl(pl, "videorate")
  thr = New MediaControl(pl, "theoraenc")
  mux = New MediaControl(pl, "oggmux")
  snk = New MediaControl(pl, "filesink")
  snk["location"] = "/tmp/video.ogg"
   
' Vengono collegati i vari plug-in di GStreamer utilizzati:
  src.LinkTo(png)
  png.LinkTo(con)
  con.LinkTo(rat)
  rat.LinkTo(thr)
  thr.LinkTo(mux)
  mux.LinkTo(snk)
   
End


Public Sub Button3_Click()
 
' Genera il file video finale:
 pl.Play()
 
End

Nella seguente terza modalità si utilizzerà il Componente gb.media soltanto nella seconda fase, ossia quella in cui viene generato il file video "OGG".
Bisognerà comunque attivare anche i Componenti gb.desktop e gb.desktop.x11, che permetteranno di utilizzare il Metodo ".GetScreenshot()" della Classe DesktopWindow, per ottenere gli screenshot della finestra prescelta.

Anche in questo esempio pratico che segue, faremo gli screenshot ed il successivo video OGG di quanto accade nella finestra aperta di un Terminale.

Va comunque precisato che in questo caso, differentemnte dalla mosdalità precedentemente vista, sarà registrato, non solo quanto accade "nella", ma anche quanto accade eventualmente al di sopra (ad esempio la sovrapposizione di un'altra finestra o il passaggio del puntatore del mouse).

Private i As Integer
Private tempus As Timer
Private dw As DesktopWindow
Private pl As MediaPipeline


Public Sub Form_Open()
 
  Dim wid As Integer

' Innanzitutto verifica l'esistenza della Cartella, ove verranno salvati i file immagini delle schermate. Se non esiste, la crea.
  If Not Exist("/tmp/VIDEO") Then Mkdir "/tmp/VIDEO"
  
' Individua il numero identificativo della finestra del Terminale...
  wid = Desktop.FindWindow("Terminal", Null, Null)[0] 
  
' ...e lo passa all'oggetto "DesktopWindow" da creare:
  dw = New DesktopWindow(wid)
  
End


Public Sub Button1_Click()
 
  With tempus = New Timer As "Tempus"
' Imposta 250 millisecondi, per ottenere 4 schermate al secondo:
    .Delay = 250
    .Start
  End With
  
End


Public Sub Tempus_Timer()
 
  Dim pc As Picture
 
  pc = dw.GetScreenshot()
  
  pc.Save("/tmp/VIDEO/fotogramma" & CStr(i) & ".png", 100)
  
  Inc i
  
End


Public Sub Button2_Click()

  tempus.Stop
 
  Genera_Video()
 
End


Private Procedure Genera_Video()
 
  Dim src, png, con, rat, thr, mux, snk As MediaControl
 
  pl = New MediaPipeline
  
  src = New MediaControl(pl, "multifilesrc")
  src["location"] = "/tmp/VIDEO/fotogramma%1d.png"
  src["index"] = 0
' Imposta il valore di 4 fotogrammi al secondo:
  src["caps"] = "image/png,framerate=4/1"
  png = New MediaControl(pl, "pngdec")
  con = New MediaControl(pl, "videoconvert")
  rat = New MediaControl(pl, "videorate")
  thr = New MediaControl(pl, "theoraenc")
  mux = New MediaControl(pl, "oggmux")
  snk = New MediaControl(pl, "filesink")
  snk["location"] = "/tmp/video.ogg"

' Vengono collegati i vari plug-in di GStreamer utilizzati:
  src.LinkTo(png)
  png.LinkTo(con)
  con.LinkTo(rat)
  rat.LinkTo(thr)
  thr.LinkTo(mux)
  mux.LinkTo(snk)
  
End


Public Sub Button3_Click()
 
' Genera il file video finale:
  pl.Play()
 
End

Esempio a riga di comando

Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, cnv, enc, mux, snk As MediaControl
 Dim flt As MediaFilter
 Dim tm As Date
 Dim i As Integer

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

 pl = New MediaPipeline 

 src = New MediaControl(pl, "ximagesrc")
' Assegna alla proprietà "xid" il numero identificativo della finestra da registrare (0 è lo schermo):
 src["xid"] = 0
 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")
 snk["location"] = "/tmp/video.ogg"
 snk["sync"] = False
 
' Collega fra loro i plugin di "GStreamer":
 src.LinkTo(cnv)
 cnv.LinkTo(flt)
 flt.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk) 

' Avvia la registrazione video:
 pl.Play()

 tm = Now

 Repeat
   i = DateDiff(tm, Now, gb.Millisecond)
' Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:
   Write "\rTempo: " & Str(Time(0, 0, 0, i))
   Wait 0.01
 Until bo

 pl.Stop()
 pl.Close()
 Print "\nRegistrazione terminata !"

' Avendo usato l'Evento "Application_Read()", per terminare l'applicazione, è necessario usare il comando "Quit":
 Quit

End


Public Sub Application_Read()  ' Cliccando sui tasti "Invio" dela tastiera, viene sollevato questo Evento

 bo = True

End


Creare un video comprensivo di audio

In questo paragrafo mostreremo un esempio per generare un file video "OGG" comprensivo di audio, registrato contemporaneamente al video mediante, ad esempio, un microfono.

Va sottolineato che dopo aver premuto il tasto di avvio della registrazione audio-video, se si sta registrando quanto accade nella finestra di un programma (e dunque non della Scrivania), bisognerà porre come finestra attiva quella del programma interessato (ad esempio con il mouse oppure via codice). Medesima attenzione bisognerà prestare subito dopo aver arrestato la registrazione.

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

  pl = New MediaPipeline 

  srcv = New MediaControl(pl, "ximagesrc")
' Si assegna alla proprietà "xid" il numero identificativo della finestra da registrare:
  srcv["xid"] = numero_identificativo_della_finestra
' 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, "alsasrc")
  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 .ogv finale:
  ogg.LinkTo(snk)
  
End


Public Sub Button1_Click()
  
' Avvia la ripresa video:
 pl.Play()
 
 Desktop.ActiveWindow = numero_identificativo_della_finestra
  
End


Public Sub Button2_Click()
 
' Ferma la registrazione:
 pl.Stop
 pl.Close
 
 Desktop.ActiveWindow = numero_identificativo_della_finestra
 
 Print "Registrazione fermata"
 Me.close
 
End


Vediamo ora un esempio con un'applicazione a riga di comando.

Anche in questo caso bisognerà avere cura di porre come finestra attiva quella del programma (di Gambas o esterno) interessato sia dopo l'avvio che dopo l'arresto della registrazione video-audio). Per fare ciò, pur in assenza di ambiente grafico, si potrà comunque attivare il Componente grafico (ad esempio) gb.gtk3 (meglio non utilizzare le risorse di QT, per non incorrere in eventuali incompatibilità fra le risorse di GSreamer e QT), il quale permetterà di attivare anche il Componente gb.desktop per il successivo uso della Proprietà ".ActiveWindow".

Private Const FINESTRA_PROGRAMMA As Integer = numero_identificativo_della_finestra
Private bo As Boolean


Public Sub Main()
 
  Dim pl As MediaPipeline
  Dim srcv, vcon, que1, the, que2, srca, que3, acon, vor, que4, ogg, snk As MediaControl
  Dim flv, fla As MediaFilter
   
  pl = New MediaPipeline 
  
  srcv = New MediaControl(pl, "ximagesrc")
  srcv["xid"] = FINESTRA_PROGRAMMA
  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, "alsasrc")
  fla = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2,width=16,depth=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 .ogv finale:
  ogg.LinkTo(snk)
   
' Avvia la ripresa audio-video:
  pl.Play()
  
' Pone come attiva la finestra del programma prescelto:
  Desktop.ActiveWindow = FINESTRA_PROGRAMMA
  
  While Not bo
' Mostra in console/terminale il tempo trascorso dall'inizio della ripresa audio-video:
    Write "\rTempo: " & Time(0, 0, 0, pl.Position * 1000)
    Wait 0.01
  Wend
  
' Pone nuovamente come attiva la finestra del programma prescelto:
  Desktop.ActiveWindow = FINESTRA_PROGRAMMA
  
  pl.Stop()
  pl.Close()

  Print "Termine registrazione"
  Quit
  
End


Public Sub Application_Read()
 
  bo = True
 
End


Creare un file video in formato "FLV"

Catturare quanto mostrato sulla Scrivania

Private pl As MediaPipeline


Public Sub Form_Open()

 Dim src, cnv, enc, mux, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "ximagesrc")
' Assegna alla proprietà "xid" del plugin "ximagesrc" il numero idetificativo della "Scrivania", affinché catturi quanto da essa visualizzato:
 src["xid"] = 0
 cnv = New MediaControl(pl, "videoconvert")
 enc = New MediaControl(pl, "x264enc")
 enc["pass"] = 5
 enc["quantizer"] = 26
 enc["speed-preset"] = 6
 mux = New MediaControl(pl, "flvmux") 
 snk = New MediaControl(pl, "filesink")
' Imposta il percorso del file video finale del formato "fLV":
 snk["location"] = "/tmp/video.flv"

 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

End

Public Sub Button1_Click()
  
' Avvia la ripresa video:
 pl.Play()
 
End

Public Sub Button2_Click()

' Ferma la registrazione:
 pl.Stop
 pl.Close

 Print "Registrazione Terminata"

End

Catturare quanto avviene visivamente in un Oggetto grafico di Gambas

In questo esempio registriamo in un video quanto avviene visivamente in un Oggetto grafico di Gambas, ad esempio un ValueBox.

Private pl As MediaPipeline


Public Sub Form_Open()

 Dim src, cnv, enc, mux, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "ximagesrc")
' Assegna alla proprietà "xid" del plugin "ximagesrc" il numero identificativo del "ValueBox", affinché catturi quanto da essa visualizzato:
 src["xid"] = ValueBox1.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 video finale del formato "FLV":
 snk["location"] = "/tmp/video.flv"

 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

End


Public Sub Button1_Click()

 Dim c As Short = 100

' Avvia la ripresa video:
 pl.Play()

 Repeat 
   Dec c
   ValueBox1.Value = c
   Wait 0.01
 Until c == 0

End


Public Sub Button2_Click()

' Ferma la registrazione:
 pl.Stop
 pl.Close

 Print "Registrazione Terminata"

End


Creare un file video in formato "AVI"

Catturare quanto mostrato sulla Scrivania

Private pl As MediaPipeline


Public Sub Form_Open()

 Dim src, cnv, mux, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "ximagesrc")
' Assegna alla proprietà "xid" del plugin "ximagesrc" il numero idetificativo della "Scrivania", affinché catturi quanto da essa visualizzato:
 src["xid"] = 0
 cnv = New MediaControl(pl, "videoconvert")
 mux = New MediaControl(pl, "avimux") 
 snk = New MediaControl(pl, "filesink")
' Imposta il percorso del file video finale del formato "AVI":
 snk["location"] = "/tmp/video.avi"

 src.LinkTo(cnv)
 cnv.LinkTo(mux)
 mux.LinkTo(snk)

End

Public Sub Button1_Click()
  
' Avvia la ripresa video:
 pl.Play()
 
End

Public Sub Button2_Click()

' Ferma la registrazione:
 pl.Stop
 pl.Close

 Print "Registrazione Terminata"

End

Catturare quanto avviene visivamente in un Oggetto grafico di Gambas

In questo esempio registriamo in un video quanto avviene visivamente in un Oggetto grafico di Gambas, ad esempio un ValueBox.

Private pl As MediaPipeline


Public Sub Form_Open()

 Dim src, cnv, mux, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "ximagesrc")
' Assegna alla proprietà "xid" del plugin "ximagesrc" il numero identificativo del "ValueBox", affinché catturi quanto da essa visualizzato:
 src["xid"] = ValueBox1.Id
 cnv = New MediaControl(pl, "videoconvert")
 mux = New MediaControl(pl, "avimux") 
 snk = New MediaControl(pl, "filesink")
' Imposta il percorso del file video finale del formato "FLV":
 snk["location"] = "/tmp/video.avi"

 src.LinkTo(cnv)
 cnv.LinkTo(mux)
 mux.LinkTo(snk)

End


Public Sub Button1_Click()

 Dim c As Short = 100

' Avvia la ripresa video:
 pl.Play()

 Repeat 
   Dec c
   ValueBox1.Value = c
   Wait 0.01
 Until c == 0

End


Public Sub Button2_Click()

' Ferma la registrazione:
 pl.Stop
 pl.Close

 Print "Registrazione Terminata"

End


Note

[1] Sulla individuazione dell'ID della finestra di un programma vedere le seguenti pagine:

[2] Vedere anche la seguente pagina della wiki: Catturare il video riprodotto in un Controllo MediaView del componente gb.media