Differenze tra le versioni di "Salvare in un file video con il Componente gb.media una ripresa video effettuata da una WebCam"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "Il Componente ''gb.media'', utilizzando particolari plugin di ''GStreamer'', consente di salvare una ripresa video mediante una WebCam in un file video. Vediamo alcuni casi d...")
 
 
(26 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Il Componente ''gb.media'', utilizzando particolari plugin di ''GStreamer'', consente di salvare una ripresa video mediante una WebCam in un file video.
+
Il Componente ''gb.media'', utilizzando particolari plugin di ''GStreamer'', consente di salvare in un file video una ripresa video effettuata con una WebCam.
 
 
Vediamo alcuni casi di ripresa video e di registrazione <U>priva di audio</u> con un'applicazione ''a riga di comando''.
 
  
 +
=Registrazione video <U>priva di audio</u>=
 +
Vediamo alcuni casi di registrazione <U>priva di audio</u> con un'applicazione ''a riga di comando'' di una ripresa video effettuata con una WebCam.
 +
<BR>La webcam sarà gestita attraverso il file-device "/dev/video'''N'''"; laddove "N" è un numero d'indice che rappresenta appunto il dispositivo webcam. Qualora questo file-device fosse occupato, oppure, essendo presenti più vwebcam, si voglia sceglierne una, si dovrà tenere conto del numero d'indice. Pertanto avremo certamente la disponibilità teorica di "/dev/video'''0'''", ma potremmo dover optare o comunque scegliere "/dev/video'''1'''", oppure "/dev/video'''2'''", etc.
 +
<BR>Per arrestare la ripresa video della webcam, bisognerà premere il tasto "Invio" della tastiera o del tastierino.
  
 
==Salvare in un file video di formato "AVI"==
 
==Salvare in un file video di formato "AVI"==
  Private bo As Boolean
+
  Private pl As MediaPipeline
 
   
 
   
 
   
 
   
 
  Public Sub Main()
 
  Public Sub Main()
 
+
  Dim pl As MediaPipeline
 
 
   Dim src, cnv, mux, snk As MediaControl
 
   Dim src, cnv, mux, snk As MediaControl
  Dim tm As Date
 
  Dim i As Integer
 
 
   
 
   
 
   pl = New MediaPipeline  
 
   pl = New MediaPipeline  
   
+
 
   src = New MediaControl(pl, "v4l2src")
 
   src = New MediaControl(pl, "v4l2src")
 
   src["device"] = "/dev/video0"
 
   src["device"] = "/dev/video0"
  src["num-buffers"] = dur
 
 
   cnv = New MediaControl(pl, "videoconvert")
 
   cnv = New MediaControl(pl, "videoconvert")
 
   mux = New MediaControl(pl, "avimux")
 
   mux = New MediaControl(pl, "avimux")
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
 
   snk["location"] = "/tmp/video.avi"
 
   snk["location"] = "/tmp/video.avi"
   
+
 
  <FONT Color=gray>' ''Collega fra loro i plugin di "GStreamer":''</font>
 
  <FONT Color=gray>' ''Collega fra loro i plugin di "GStreamer":''</font>
 
   src.LinkTo(cnv)
 
   src.LinkTo(cnv)
 
   cnv.LinkTo(mux)
 
   cnv.LinkTo(mux)
 
   mux.LinkTo(snk)  
 
   mux.LinkTo(snk)  
 
+
 
  <FONT Color=gray>' ''Avvia la ripresa video:''</font>
 
  <FONT Color=gray>' ''Avvia la ripresa video:''</font>
 
   pl.Play()
 
   pl.Play()
 
+
 +
<FONT Color=gray>' ''Attende che l'Oggetto "MediaPipeline" avvii effettivamente la ripresa video:''</font>
 +
  Repeat
 +
    Wait 0.01
 +
  Until pl.Position > 0.0
 +
 +
  While pl.State = Media.Playing
 +
<FONT Color=gray>' ''Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:''</font>
 +
    Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
 +
    Flush
 +
    Wait 0.01
 +
  Wend
 +
 +
  pl.Close()
 +
  Print "\nRegistrazione terminata !"
 +
<FONT Color=gray>' ''Essendo stato utilizzato l'Evento "Application_Read()", è necessario usare l'istruzione "Quit" per terminare il programma e così per poter creare il file video:''</font>
 +
  Quit
 +
 +
End
 +
 +
 +
Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma''</font>
 +
 +
  pl.Stop
 +
 
 +
End
 +
Una parte del codice, volendo evitare l'uso del ciclo "Repeat...Until", potrà essere impostato anche come segue:
 +
Private bo As Boolean
 +
 +
 +
Public Sub Main()
 +
 
 +
  Dim pl As MediaPipeline
 +
  ......
 +
  Dim tm As Date
 +
 +
  ......
 +
  ......
 +
 +
  pl.Play()
 +
 
   tm = Now  
 
   tm = Now  
 
+
 
 
   While Not bo
 
   While Not bo
    i = DateDiff(tm, Now, gb.Millisecond)
+
     Write "\rTempo: " & Str(Time(0, 0, 0, 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))
 
 
     Flush  
 
     Flush  
     Wait 0.1
+
     Wait 0.01
 
   Wend
 
   Wend
 
+
 
   pl.Stop()
 
   pl.Stop()
 
   pl.Close()
 
   pl.Close()
 
   Print "\nRegistrazione terminata !"
 
   Print "\nRegistrazione terminata !"
<FONT Color=gray>' ''Essendo stato utilizzato l'Evento "Application_Read()", è necessario usare l'istruzione "Quit" per terminare il programma e così per poter creare il file video:''</font>
 
 
   Quit
 
   Quit
 
   
 
   
Riga 52: Riga 87:
 
   
 
   
 
   
 
   
  Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma''</font>
+
  Public Sub Application_Read()
 
   
 
   
 
   bo = True
 
   bo = True
 
+
 
  End
 
  End
 +
Questa variante potrà essere ovviamente adottata anche per i codici sottostanti.
  
  
 
==Salvare in un file video di formato "FLV"==
 
==Salvare in un file video di formato "FLV"==
  Private bo As Boolean
+
  Private pl As MediaPipeline
 
   
 
   
 
   
 
   
 
  Public Sub Main()
 
  Public Sub Main()
 
    
 
    
  Dim pl As MediaPipeline
 
 
   Dim src, cnv, enc, mux, snk As MediaControl
 
   Dim src, cnv, enc, mux, snk As MediaControl
  Dim tm As Date
 
  Dim i As Integer
 
 
   
 
   
 
   pl = New MediaPipeline  
 
   pl = New MediaPipeline  
Riga 74: Riga 107:
 
   src = New MediaControl(pl, "v4l2src")
 
   src = New MediaControl(pl, "v4l2src")
 
   src["device"] = "/dev/video0"
 
   src["device"] = "/dev/video0"
  src["num-buffers"] = dur
 
 
   cnv = New MediaControl(pl, "videoconvert")
 
   cnv = New MediaControl(pl, "videoconvert")
 
   enc = New MediaControl(pl, "x264enc")
 
   enc = New MediaControl(pl, "x264enc")
Riga 92: Riga 124:
 
  <FONT Color=gray>' ''Avvia la ripresa video:''</font>
 
  <FONT Color=gray>' ''Avvia la ripresa video:''</font>
 
   pl.Play()
 
   pl.Play()
 
+
   tm = Now
+
<FONT Color=gray>' ''Attende che la "Pipeline" avvii effetttivamente la ripresa video:''</font>
 
+
   Repeat
   While Not bo
+
    Wait 0.01
    i = DateDiff(tm, Now, gb.Millisecond)
+
  Until pl.Position > 0.0
 +
 +
   While pl.State = Media.Playing
 
  <FONT Color=gray>' ''Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:''</font>
 
  <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))
+
     Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Flush  
 
     Flush  
     Wait 0.1
+
     Wait 0.01
 
   Wend
 
   Wend
 
+
  pl.Stop()
 
 
   pl.Close()
 
   pl.Close()
 
   Print "\nRegistrazione terminata !"
 
   Print "\nRegistrazione terminata !"
Riga 114: Riga 147:
 
  Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma''</font>
 
  Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma''</font>
 
   
 
   
   bo = True
+
   pl.Stop
 
    
 
    
 
  End
 
  End
Riga 120: Riga 153:
  
 
==Salvare in un file video di formato "MKV" (Matroska)==
 
==Salvare in un file video di formato "MKV" (Matroska)==
  Private bo As Boolean
+
  Private pl As MediaPipeline
 
   
 
   
 
   
 
   
 
  Public Sub Main()
 
  Public Sub Main()
 
+
  Dim pl As MediaPipeline
 
 
   Dim src, cnv, enc, mux, snk As MediaControl
 
   Dim src, cnv, enc, mux, snk As MediaControl
 
   Dim ftr As MediaFilter
 
   Dim ftr As MediaFilter
  Dim tm As Date
 
  Dim i As Integer
 
 
   
 
   
 
   pl = New MediaPipeline  
 
   pl = New MediaPipeline  
Riga 152: Riga 182:
 
   pl.Play()
 
   pl.Play()
 
    
 
    
   tm = Now
+
<FONT Color=gray>' ''Attende che la "Pipeline" avvii effetttivamente la ripresa video:''</font>
    
+
   Repeat
   While Not bo
+
    Wait 0.01
    i = DateDiff(tm, Now, gb.Millisecond)
+
   Until pl.Position > 0.0
 +
 +
   While pl.State = Media.Playing
 
  <FONT Color=gray>' ''Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:''</font>
 
  <FONT Color=gray>' ''Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:''</font>
     Write "\rTempo: " & CStr(Time(0, 0, 0, i))
+
     Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
 +
    Flush
 +
    Wait 0.01
 
   Wend
 
   Wend
 
   
 
   
  pl.Stop()
 
 
   pl.Close()
 
   pl.Close()
 
   Print "\nRegistrazione terminata !"
 
   Print "\nRegistrazione terminata !"
Riga 171: Riga 204:
 
  Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma''</font>
 
  Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma''</font>
 
   
 
   
   bo = True
+
   pl.Stop
 
   
 
   
 
  End
 
  End
Riga 177: Riga 210:
  
 
==Salvare in un file video di formato "MP4"==
 
==Salvare in un file video di formato "MP4"==
  Private bo As Boolean
+
  Private pl As MediaPipeline
 
   
 
   
 
   
 
   
 
  Public Sub Main()
 
  Public Sub Main()
 
+
  Dim pl As MediaPipeline
 
 
   Dim src, cnv, enc, mux, snk As MediaControl
 
   Dim src, cnv, enc, mux, snk As MediaControl
  Dim tm As Date
 
  Dim i As Integer
 
 
   
 
   
 
   pl = New MediaPipeline  
 
   pl = New MediaPipeline  
   
+
 
   src = New MediaControl(pl, "v4l2src")
 
   src = New MediaControl(pl, "v4l2src")
 
   src["device"] = "/dev/video0"
 
   src["device"] = "/dev/video0"
  src["num-buffers"] = dur
 
 
   cnv = New MediaControl(pl, "videoconvert")
 
   cnv = New MediaControl(pl, "videoconvert")
 
   enc = New MediaControl(pl, "x264enc")
 
   enc = New MediaControl(pl, "x264enc")
 +
  enc["pass"] = 5
 +
  enc["quantizer"] = 26
 +
  enc["speed-preset"] = 6
 
   mux = New MediaControl(pl, "mp4mux")
 
   mux = New MediaControl(pl, "mp4mux")
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
Riga 207: Riga 239:
 
   pl.Play()
 
   pl.Play()
 
    
 
    
   tm = Now
+
<FONT Color=gray>' ''Attende che la "Pipeline" avvii effettivamente la ripresa video:''</font>
 
+
   Repeat
   While Not bo
+
    Wait 0.01
    i = DateDiff(tm, Now, gb.Millisecond)
+
  Until pl.Position > 0.0
 +
 +
   While pl.State = Media.Playing
 
  <FONT Color=gray>' ''Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:''</font>
 
  <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))
+
     Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Flush  
 
     Flush  
     Wait 0.1
+
     Wait 0.01
 
   Wend
 
   Wend
 
+
  pl.Stop()
 
 
   pl.Close()
 
   pl.Close()
 
   Print "\nRegistrazione terminata !"
 
   Print "\nRegistrazione terminata !"
Riga 228: Riga 261:
 
  Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma''</font>
 
  Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma''</font>
 
   
 
   
   bo = True
+
   pl.Stop
 
    
 
    
 
  End
 
  End
Riga 234: Riga 267:
  
 
==Salvare in un file video di formato "OGG-Theora"==
 
==Salvare in un file video di formato "OGG-Theora"==
  Private bo As Boolean
+
  Private pl As MediaPipeline
 
   
 
   
 
   
 
   
 
  Public Sub Main()
 
  Public Sub Main()
 
+
  Dim pl As MediaPipeline
 
 
   Dim src, cnv, the, ogg, snk As MediaControl
 
   Dim src, cnv, the, ogg, snk As MediaControl
  Dim ftr As MediaFilter
 
 
   
 
   
 
   pl = New MediaPipeline  
 
   pl = New MediaPipeline  
 
+
 
   src = New MediaControl(pl, "v4l2src")
 
   src = New MediaControl(pl, "v4l2src")
 
   src["device"] = "/dev/video0"
 
   src["device"] = "/dev/video0"
  ftr = New MediaFilter(pl, "video/x-raw,width=640,height=480,framerate=32/1")
 
 
   cnv = New MediaControl(pl, "videoconvert")
 
   cnv = New MediaControl(pl, "videoconvert")
 
   the = New MediaControl(pl, "theoraenc")
 
   the = New MediaControl(pl, "theoraenc")
Riga 256: Riga 286:
 
    
 
    
 
  <FONT Color=gray>' ''Collega fra loro i plugin di "GStreamer":''</font>
 
  <FONT Color=gray>' ''Collega fra loro i plugin di "GStreamer":''</font>
   src.LinkTo(ftr)
+
   src.LinkTo(cnv)
  ftr.LinkTo(cnv)
 
 
   cnv.LinkTo(the)
 
   cnv.LinkTo(the)
 
   the.LinkTo(ogg)
 
   the.LinkTo(ogg)
Riga 264: Riga 293:
 
  <FONT Color=gray>' ''Avvia la ripresa video:''</font>
 
  <FONT Color=gray>' ''Avvia la ripresa video:''</font>
 
   pl.Play()
 
   pl.Play()
 
+
   While Not bo
+
<FONT Color=gray>' ''Attende che la "Pipeline" avvii effettivamente la ripresa video:''</font>
 +
  Repeat
 +
    Wait 0.01
 +
  Until pl.Position > 0.0
 +
 +
   While pl.State = Media.Playing
 
  <FONT Color=gray>' ''Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:''</font>
 
  <FONT Color=gray>' ''Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:''</font>
 
     Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
Riga 272: Riga 306:
 
   Wend
 
   Wend
 
   
 
   
  pl.Stop()
 
 
   pl.Close
 
   pl.Close
 
 
 
   Print "\nTermine registrazione"
 
   Print "\nTermine registrazione"
 
   
 
   
Riga 284: Riga 316:
 
   
 
   
 
  Public Sub Application_Read()  <FONT Color=gray>' ''Cliccando sul tasto "Invio" della tastiera, si solleverà questo Evento''</font>
 
  Public Sub Application_Read()  <FONT Color=gray>' ''Cliccando sul tasto "Invio" della tastiera, si solleverà questo Evento''</font>
 +
 +
  pl.Stop()
 +
 +
End
 +
 +
 +
==Salvare in un file video di formato "RAW"==
 +
Private pl As MediaPipeline
 +
 +
 +
Public Sub Main()
 +
 +
  Dim src, cnv, enc, mux, snk As MediaControl
 +
 +
  pl = New MediaPipeline
 +
   
 +
  src = New MediaControl(pl, "v4l2src")
 +
  src["device"] = "/dev/video0"
 +
  cnv = New MediaControl(pl, "videoconvert")
 +
  enc = New MediaControl(pl, "x264enc")
 +
  enc["speed-preset"] = 6
 +
  enc["bitrate"] = 1024
 +
  mux = New MediaControl(pl, "mpegtsmux")
 +
  snk = New MediaControl(pl, "filesink")
 +
  snk["location"] = "/tmp/video.raw"
 +
   
 +
<FONT Color=gray>' ''Collega fra loro i plugin di "GStreamer":''</font>
 +
  src.LinkTo(cnv)
 +
  cnv.LinkTo(enc)
 +
  enc.LinkTo(mux)
 +
  mux.LinkTo(snk)
 
    
 
    
   bo = True
+
<FONT Color=gray>' ''Avvia la ripresa video:''</font>
 
+
  pl.Play()
 +
 +
<FONT Color=gray>' ''Attende che la "Pipeline" avvii effettivamente la ripresa video:''</font>
 +
  Repeat
 +
    Wait 0.01
 +
   Until pl.Position > 0.0
 +
 +
  While pl.State = Media.Playing
 +
<FONT Color=gray>' ''Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:''</font>
 +
    Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
 +
    Flush
 +
    Wait 0.01
 +
  Wend
 +
 +
  pl.Close()
 +
  Print "\nRegistrazione terminata !"
 +
<FONT Color=gray>' ''Essendo stato utilizzato l'Evento "Application_Read()", è necessario usare l'istruzione "Quit" per terminare il programma e così per poter creare il file video:''</font>
 +
  Quit
 +
 +
End
 +
 +
 +
Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma''</font>
 +
 +
  pl.Stop()
 +
 
 
  End
 
  End
  
Per mostrare eventualmente all'interno della finestra del video anche il tempo trascorso dall'inizio della ripresa video, è necessario utilizzare il plugin "''timeoverlay''"
 
  
 +
=Registrazione e creazione di un file video <U>comprensivo di audio</u>=
 +
Per la creazione di un file video <U>comprensivo di traccia audio</u> da una ripresa video, effettuata con WebCam, bisognerà utilizzare ovviamente Elementi di ''Gstremaer'' adatti per il video ed altri adatti per l'audio.
  
=Ripresa video comprensiva di traccia audio=
 
 
Vediamo un esempio di creazione di un file video <U>comprensivo di traccia audio</u> mediante un'applicazione ''a riga di comando''.
 
Vediamo un esempio di creazione di un file video <U>comprensivo di traccia audio</u> mediante un'applicazione ''a riga di comando''.
<BR>In tal caso bisognerà utilizzare ovviamente Elementi di ''Gstremaer'' adatti per il video ed altri adatti per l'audio. Essi all'interno della ''pipeline'' assumono un'organizzazione, per cui dopo l'Elemento iniziale di ''GStreamer'' per la ripresa video con la webcam, vi è un primo blocco attinente alla gestione del video, l'ultimo Elemento del quale si collegherà direttamente al penultimo Elemento della ''pipeline'' preposto alla miscelazione dei dati audio e video. Il secondo blocco è afferente alla gestione dell'audio; ed anche per questo l'ultimo suo Elemento si collegherà direttamente all'ultimo Elemento della ''pipeline'' preposto alla dei dati audio e video.
+
 
 +
==Salvare in un file audio/video di formato "OGG-Theora"==
 +
In questo caso gli Elementi (plugin) di ''Gstremaer'', adatti per il video, e quelli adatti per l'audio assumono all'interno della ''pipeline'' un'organizzazione, per cui dopo l'Elemento iniziale di ''GStreamer'' per la ripresa video con la webcam, vi è un primo blocco attinente alla gestione del video, l'ultimo Elemento del quale si collegherà direttamente al penultimo Elemento della ''pipeline'' preposto alla miscelazione dei dati audio e video. Il secondo blocco è afferente alla gestione dell'audio; ed anche per questo l'ultimo suo Elemento si collegherà direttamente all'ultimo Elemento della ''pipeline'' preposto alla dei dati audio e video.
  
 
Mostriamo un esempio pratico:
 
Mostriamo un esempio pratico:
  Private bo As Boolean
+
  Private pl As MediaPipeline
 
   
 
   
 
   
 
   
 
  Public Sub Main()
 
  Public Sub Main()
 
+
  Dim pl As MediaPipeline
 
 
   Dim srcv, rat, que1, vcon, the, que2, srca, que3, acon, vor, que4, ogg, snk As MediaControl
 
   Dim srcv, rat, que1, vcon, the, que2, srca, que3, acon, vor, que4, ogg, snk As MediaControl
 
   Dim flv, fla As MediaFilter
 
   Dim flv, fla As MediaFilter
Riga 347: Riga 436:
 
   pl.Play()
 
   pl.Play()
 
    
 
    
   While Not bo
+
<FONT Color=gray>' ''Attende che la "Pipeline" avvii effettivamente la ripresa video:''</font>
  <FONT Color=gray>' ''Mostra in console/terminale il tempo trascorso dall'inizio della ripresa audio-video:''</font>
+
  Repeat
 +
    Wait 0.01
 +
  Until pl.Position > 0.0
 +
 +
   While pl.State = Media.Playing
 +
  <FONT Color=gray>' ''Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:''</font>
 
     Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Flush
 
     Flush
Riga 354: Riga 448:
 
   Wend
 
   Wend
 
   
 
   
  pl.Stop()
 
 
   pl.Close()
 
   pl.Close()
 
   Print "\nTermine registrazione"
 
   Print "\nTermine registrazione"
Riga 365: Riga 458:
 
  Public Sub Application_Read()  <FONT Color=gray>' ''Cliccando sul tasto "Invio" della tastiera, si solleverà questo Evento''</font>
 
  Public Sub Application_Read()  <FONT Color=gray>' ''Cliccando sul tasto "Invio" della tastiera, si solleverà questo Evento''</font>
 
    
 
    
   bo = True
+
   pl.Stop
 
    
 
    
 
  End
 
  End
 +
 +
 +
=Inserire un testo nel video=
 +
Per inserire nel video registrato anche un testo qualsiasi, si imposterà il plugin di GStreamer ''textoverlay''.
 +
 +
Esempio:
 +
<FONT Color=darkorange>Private Enum left = 0, hcenter, right
 +
Private Enum baseline = 0, bottom, top, position, vcenter, absolute</font>
 +
 +
......
 +
cnv = New MediaControl(pl, "videoconvert")
 +
<FONT Color=darkorange>tol = New MediaControl(pl, "textoverlay")
 +
tol["text"] = "Testo quasiasi nel Video"
 +
tol["halignment"] = left
 +
tol["valignment"] = bottom
 +
tol["shaded-background"] = True</font>
 +
the = New MediaControl(pl, "theoraenc")
 +
......
 +
Quindi procedere ai conseguenti necessari collegamenti dei plugin.
 +
 +
 +
=Inserire nel video il tempo trascorso dall'inizio della ripresa video=
 +
Per inserire - in forma testuale - nel video registrato anche il tempo trascorso dall'inizio della ripresa video, si imposterà il plugin di GStreamer ''timeoverlay''.
 +
 +
Esempio:
 +
<FONT Color=darkorange>Private Enum left = 0, hcenter, right
 +
Private Enum baseline = 0, bottom, top, position, vcenter, absolute</font>
 +
 +
......
 +
cnv = New MediaControl(pl, "videoconvert")
 +
<FONT Color=darkorange>tol = New MediaControl(pl, "timeoverlay")
 +
tol["text"] = "Tempo trascorso: "
 +
tol["halignment"] = left
 +
tol["valignment"] = bottom
 +
tol["shaded-background"] = True</font>
 +
the = New MediaControl(pl, "theoraenc")
 +
......
 +
Quindi procedere ai conseguenti necessari collegamenti dei plugin.

Versione attuale delle 23:50, 18 lug 2024

Il Componente gb.media, utilizzando particolari plugin di GStreamer, consente di salvare in un file video una ripresa video effettuata con una WebCam.

Registrazione video priva di audio

Vediamo alcuni casi di registrazione priva di audio con un'applicazione a riga di comando di una ripresa video effettuata con una WebCam.
La webcam sarà gestita attraverso il file-device "/dev/videoN"; laddove "N" è un numero d'indice che rappresenta appunto il dispositivo webcam. Qualora questo file-device fosse occupato, oppure, essendo presenti più vwebcam, si voglia sceglierne una, si dovrà tenere conto del numero d'indice. Pertanto avremo certamente la disponibilità teorica di "/dev/video0", ma potremmo dover optare o comunque scegliere "/dev/video1", oppure "/dev/video2", etc.
Per arrestare la ripresa video della webcam, bisognerà premere il tasto "Invio" della tastiera o del tastierino.

Salvare in un file video di formato "AVI"

Private pl As MediaPipeline


Public Sub Main()

 Dim src, cnv, mux, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "v4l2src")
 src["device"] = "/dev/video0"
 cnv = New MediaControl(pl, "videoconvert")
 mux = New MediaControl(pl, "avimux")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/video.avi"

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

' Avvia la ripresa video:
 pl.Play()

' Attende che l'Oggetto "MediaPipeline" avvii effettivamente la ripresa video:
 Repeat 
   Wait 0.01
 Until pl.Position > 0.0

 While pl.State = Media.Playing
' Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Flush 
   Wait 0.01
 Wend

 pl.Close()
 Print "\nRegistrazione terminata !"
' Essendo stato utilizzato l'Evento "Application_Read()", è necessario usare l'istruzione "Quit" per terminare il programma e così per poter creare il file video:
 Quit

End


Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma

 pl.Stop
 
End

Una parte del codice, volendo evitare l'uso del ciclo "Repeat...Until", potrà essere impostato anche come segue:

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 ......
 Dim tm As Date

 ......
 ......

 pl.Play()

 tm = Now 
 
 While Not bo
   Write "\rTempo: " & Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)))
   Flush 
   Wait 0.01
 Wend

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

End


Public Sub Application_Read()

 bo = True

End

Questa variante potrà essere ovviamente adottata anche per i codici sottostanti.


Salvare in un file video di formato "FLV"

Private pl As MediaPipeline


Public Sub Main()
  
 Dim src, cnv, enc, mux, snk As MediaControl

 pl = New MediaPipeline 
   
 src = New MediaControl(pl, "v4l2src")
 src["device"] = "/dev/video0"
 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")
 snk["location"] = "/tmp/video.flv"
    
' Collega fra loro i plugin di "GStreamer":
 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk) 
  
' Avvia la ripresa video:
 pl.Play()

' Attende che la "Pipeline" avvii effetttivamente la ripresa video:
 Repeat 
   Wait 0.01
 Until pl.Position > 0.0

 While pl.State = Media.Playing
' Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Flush 
   Wait 0.01
 Wend

 pl.Close()
 Print "\nRegistrazione terminata !"
' Essendo stato utilizzato l'Evento "Application_Read()", è necessario usare l'istruzione "Quit" per terminare il programma e così per poter creare il file video:
 Quit

End


Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma

 pl.Stop
 
End


Salvare in un file video di formato "MKV" (Matroska)

Private pl As MediaPipeline


Public Sub Main()

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

 pl = New MediaPipeline 
   
 src = New MediaControl(pl, "v4l2src")
 src["device"] = "/dev/video0"
 ftr = New MediaFilter(pl, "video/x-raw,width=640,height=480")
 cnv = New MediaControl(pl, "videoconvert")
 enc = New MediaControl(pl, "x264enc")
 mux = New MediaControl(pl, "matroskamux")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/video.mkv"
    
' Colleghiamo fra loro i plugin di "GStreamer":
 src.LinkTo(ftr)
 ftr.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk) 
  
' Avvia la ripresa video:
 pl.Play()
  
' Attende che la "Pipeline" avvii effetttivamente la ripresa video:
 Repeat 
   Wait 0.01
 Until pl.Position > 0.0

 While pl.State = Media.Playing
' Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Flush 
   Wait 0.01
 Wend

 pl.Close()
 Print "\nRegistrazione terminata !"
' Essendo stato utilizzato l'Evento "Application_Read()", è necessario usare l'istruzione "Quit" per terminare il programma e così per poter creare il file video:
 Quit

End


Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma

 pl.Stop

End


Salvare in un file video di formato "MP4"

Private pl As MediaPipeline


Public Sub Main()

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

 pl = New MediaPipeline 

 src = New MediaControl(pl, "v4l2src")
 src["device"] = "/dev/video0"
 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")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/video.mp4"
    
' Collega fra loro i plugin di "GStreamer":
 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk) 
  
' Avvia la ripresa video:
 pl.Play()
  
' Attende che la "Pipeline" avvii effettivamente la ripresa video:
 Repeat 
   Wait 0.01
 Until pl.Position > 0.0

 While pl.State = Media.Playing
' Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Flush 
   Wait 0.01
 Wend

 pl.Close()
 Print "\nRegistrazione terminata !"
' Essendo stato utilizzato l'Evento "Application_Read()", è necessario usare l'istruzione "Quit" per terminare il programma e così per poter creare il file video:
 Quit

End


Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma

 pl.Stop
 
End


Salvare in un file video di formato "OGG-Theora"

Private pl As MediaPipeline


Public Sub Main()

 Dim src, cnv, the, ogg, snk As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "v4l2src")
 src["device"] = "/dev/video0"
 cnv = New MediaControl(pl, "videoconvert")
 the = New MediaControl(pl, "theoraenc")
 ogg = New MediaControl(pl, "oggmux")
 ogg["name"] = "mux"
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/video.ogg"
 
' Collega fra loro i plugin di "GStreamer":
 src.LinkTo(cnv)
 cnv.LinkTo(the)
 the.LinkTo(ogg)
 ogg.LinkTo(snk)
  
' Avvia la ripresa video:
 pl.Play()

' Attende che la "Pipeline" avvii effettivamente la ripresa video:
 Repeat
   Wait 0.01
 Until pl.Position > 0.0

 While pl.State = Media.Playing
' Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Flush
   Wait 0.01
 Wend

 pl.Close
 Print "\nTermine registrazione"

' Avendo usato l'Evento "Application_Read(),", per terminale il programma si dovrà invocare il comando "Quit":
 Quit
     
End


Public Sub Application_Read()   ' Cliccando sul tasto "Invio" della tastiera, si solleverà questo Evento

 pl.Stop()

End


Salvare in un file video di formato "RAW"

Private pl As MediaPipeline


Public Sub Main()

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

 pl = New MediaPipeline 
   
 src = New MediaControl(pl, "v4l2src")
 src["device"] = "/dev/video0"
 cnv = New MediaControl(pl, "videoconvert")
 enc = New MediaControl(pl, "x264enc")
 enc["speed-preset"] = 6
 enc["bitrate"] = 1024
 mux = New MediaControl(pl, "mpegtsmux")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/video.raw"
    
' Collega fra loro i plugin di "GStreamer":
 src.LinkTo(cnv)
 cnv.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk) 
  
' Avvia la ripresa video:
 pl.Play()

' Attende che la "Pipeline" avvii effettivamente la ripresa video:
 Repeat 
   Wait 0.01
 Until pl.Position > 0.0

 While pl.State = Media.Playing
' Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Flush 
   Wait 0.01
 Wend

 pl.Close()
 Print "\nRegistrazione terminata !"
' Essendo stato utilizzato l'Evento "Application_Read()", è necessario usare l'istruzione "Quit" per terminare il programma e così per poter creare il file video:
 Quit

End


Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera si arresta la ripresa video e si chiude il programma

 pl.Stop()
 
End


Registrazione e creazione di un file video comprensivo di audio

Per la creazione di un file video comprensivo di traccia audio da una ripresa video, effettuata con WebCam, bisognerà utilizzare ovviamente Elementi di Gstremaer adatti per il video ed altri adatti per l'audio.

Vediamo un esempio di creazione di un file video comprensivo di traccia audio mediante un'applicazione a riga di comando.

Salvare in un file audio/video di formato "OGG-Theora"

In questo caso gli Elementi (plugin) di Gstremaer, adatti per il video, e quelli adatti per l'audio assumono all'interno della pipeline un'organizzazione, per cui dopo l'Elemento iniziale di GStreamer per la ripresa video con la webcam, vi è un primo blocco attinente alla gestione del video, l'ultimo Elemento del quale si collegherà direttamente al penultimo Elemento della pipeline preposto alla miscelazione dei dati audio e video. Il secondo blocco è afferente alla gestione dell'audio; ed anche per questo l'ultimo suo Elemento si collegherà direttamente all'ultimo Elemento della pipeline preposto alla dei dati audio e video.

Mostriamo un esempio pratico:

Private pl As MediaPipeline


Public Sub Main()

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

 pl = New MediaPipeline 

 srcv = New MediaControl(pl, "v4l2src")
 rat = New MediaControl(pl, "videorate")
 flv = New MediaFilter(pl, "video/x-raw,framerate=32/1")
 que1 = New MediaControl(pl, "queue")
 vcon = New MediaControl(pl, "videoconvert")
 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(rat)
 rat.LinkTo(flv)
 flv.LinkTo(que1)
 que1.LinkTo(vcon)
 vcon.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" finale:
 ogg.LinkTo(snk)
  
' Avvia la ripresa audio-video:
 pl.Play()
  
' Attende che la "Pipeline" avvii effettivamente la ripresa video:
 Repeat
   Wait 0.01
 Until pl.Position > 0.0

 While pl.State = Media.Playing
' Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Flush
   Wait 0.01
 Wend

 pl.Close()
 Print "\nTermine registrazione"
' Essendo stato utilizzato l'Evento "Application_Read()", è necessario usare l'istruzione "Quit" per terminare il programma e così per poter creare il file video:
 Quit
  
End


Public Sub Application_Read()  ' Cliccando sul tasto "Invio" della tastiera, si solleverà questo Evento
  
 pl.Stop
  
End


Inserire un testo nel video

Per inserire nel video registrato anche un testo qualsiasi, si imposterà il plugin di GStreamer textoverlay.

Esempio:

Private Enum left = 0, hcenter, right
Private Enum baseline = 0, bottom, top, position, vcenter, absolute

......
cnv = New MediaControl(pl, "videoconvert")
tol = New MediaControl(pl, "textoverlay")
tol["text"] = "Testo quasiasi nel Video"
tol["halignment"] = left
tol["valignment"] = bottom
tol["shaded-background"] = True
the = New MediaControl(pl, "theoraenc")
......

Quindi procedere ai conseguenti necessari collegamenti dei plugin.


Inserire nel video il tempo trascorso dall'inizio della ripresa video

Per inserire - in forma testuale - nel video registrato anche il tempo trascorso dall'inizio della ripresa video, si imposterà il plugin di GStreamer timeoverlay.

Esempio:

Private Enum left = 0, hcenter, right
Private Enum baseline = 0, bottom, top, position, vcenter, absolute

......
cnv = New MediaControl(pl, "videoconvert")
tol = New MediaControl(pl, "timeoverlay")
tol["text"] = "Tempo trascorso: "
tol["halignment"] = left
tol["valignment"] = bottom
tol["shaded-background"] = True
the = New MediaControl(pl, "theoraenc")
......

Quindi procedere ai conseguenti necessari collegamenti dei plugin.