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.
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 una ripresa video mediante una WebCam in un file video.
  
Vediamo alcuni casi di ripresa video e di registrazione <U>priva di audio</u> con un'applicazione ''a riga di comando''.
+
Vediamo alcuni casi di ripresa video e di registrazione <U>priva di audio</u>.
  
  
 
==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 Form_Open()
 
    
 
    
  Dim pl As MediaPipeline
 
 
   Dim src, cnv, mux, snk As MediaControl
 
   Dim src, cnv, mux, snk As MediaControl
 
   Dim tm As Date
 
   Dim tm As Date
Riga 19: Riga 18:
 
   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")
Riga 35: Riga 33:
 
   tm = Now  
 
   tm = Now  
 
    
 
    
   While Not bo
+
   While pl.State = Media.Playing
 
     i = DateDiff(tm, Now, gb.Millisecond)
 
     i = DateDiff(tm, Now, gb.Millisecond)
 
  <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>
Riga 46: Riga 44:
 
   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
 
 
   
 
   
 
  End
 
  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>
+
  Public Sub Button1_Click() <FONT Color=gray>' ''Premendo il "Button1" si arresta la ripresa video''</font>
 
   
 
   
   bo = True
+
   pl.State = Media.Ready
 
    
 
    
 
  End
 
  End
Riga 60: Riga 56:
  
 
==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 tm As Date
Riga 74: Riga 69:
 
   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 89: Riga 83:
 
   enc.LinkTo(mux)
 
   enc.LinkTo(mux)
 
   mux.LinkTo(snk)  
 
   mux.LinkTo(snk)  
 
+
 +
  Write "Attendere......"
 +
  Flush
 +
 +
<FONT Color=gray>' ''Attende che l'esecuzione della ripresa si avvi:''</font>
 +
  Repeat
 +
    Wait 0.01
 +
  Until pl.Pos > 0.0
 +
 
  <FONT Color=gray>' ''Avvia la ripresa video:''</font>
 
  <FONT Color=gray>' ''Avvia la ripresa video:''</font>
 
   pl.Play()
 
   pl.Play()
Riga 95: Riga 97:
 
   tm = Now  
 
   tm = Now  
 
    
 
    
   While Not bo
+
   While pl.State = Media.Playing
 
     i = DateDiff(tm, Now, gb.Millisecond)
 
     i = DateDiff(tm, Now, gb.Millisecond)
 
  <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>
Riga 102: Riga 104:
 
     Wait 0.1
 
     Wait 0.1
 
   Wend
 
   Wend
 
+
  pl.Stop()
 
  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>
 
  <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 114: Riga 113:
 
  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.State = Media.Ready
    
+
   pl.Stop()
 +
  pl.Close()
 +
  Print "\nRegistrazione terminata !"
 +
 
  End
 
  End
  

Versione delle 08:17, 14 lug 2024

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 di ripresa video e di registrazione priva di audio.


Salvare in un file video di formato "AVI"

Private pl As MediaPipeline


Public Sub Form_Open()
  
 Dim src, cnv, mux, snk As MediaControl
 Dim tm As Date
 Dim i As Integer

 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()
  
 tm = Now 
  
 While pl.State = Media.Playing
   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))
   Flush 
   Wait 0.1
 Wend
 
 pl.Stop()
 pl.Close()
 Print "\nRegistrazione terminata !"

End


Public Sub Button1_Click() ' Premendo il "Button1" si arresta la ripresa video

 pl.State = Media.Ready
 
End


Salvare in un file video di formato "FLV"

Private pl As MediaPipeline


Public Sub Main()
  
 Dim src, cnv, enc, mux, snk As MediaControl
 Dim tm As Date
 Dim i As Integer

 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) 

 Write "Attendere......"
 Flush

' Attende che l'esecuzione della ripresa si avvi:
 Repeat 
   Wait 0.01
 Until pl.Pos > 0.0

' Avvia la ripresa video:
 pl.Play()
  
 tm = Now 
  
 While pl.State = Media.Playing
   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))
   Flush 
   Wait 0.1
 Wend

' 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.State = Media.Ready
 pl.Stop()
 pl.Close()
 Print "\nRegistrazione terminata !"

End


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

Private bo As Boolean


Public Sub Main()
  
 Dim pl As MediaPipeline
 Dim src, cnv, enc, mux, snk As MediaControl
 Dim ftr As MediaFilter
 Dim tm As Date
 Dim i As Integer

 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()
  
 tm = Now
 
 While Not bo
   i = DateDiff(tm, Now, gb.Millisecond)
' Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:
   Write "\rTempo: " & CStr(Time(0, 0, 0, i))
 Wend

 pl.Stop()
 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

 bo = True

End


Salvare in un file video di formato "MP4"

Private bo As Boolean


Public Sub Main()
  
 Dim pl As MediaPipeline
 Dim src, cnv, enc, mux, snk As MediaControl
 Dim tm As Date
 Dim i As Integer

 pl = New MediaPipeline 
   
 src = New MediaControl(pl, "v4l2src")
 src["device"] = "/dev/video0"
 src["num-buffers"] = dur
 cnv = New MediaControl(pl, "videoconvert")
 enc = New MediaControl(pl, "x264enc")
 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()
  
 tm = Now 
  
 While Not bo
   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))
   Flush 
   Wait 0.1
 Wend
 
 pl.Stop()
 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

 bo = True
 
End


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

Private bo As Boolean


Public Sub Main()
  
 Dim pl As MediaPipeline
 Dim src, cnv, the, ogg, 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,framerate=32/1")
 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(ftr)
 ftr.LinkTo(cnv)
 cnv.LinkTo(the)
 the.LinkTo(ogg)
 ogg.LinkTo(snk)
  
' Avvia la ripresa video:
 pl.Play()
  
 While Not bo
' 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.Stop()
 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
  
 bo = True
  
End

Per mostrare eventualmente all'interno della finestra del video anche il tempo trascorso dall'inizio della ripresa video, è necessario utilizzare il plugin "timeoverlay"


Ripresa video e creazione di un file audio/video di formato "OGG-Theora"

Vediamo un esempio di creazione di un file video comprensivo di traccia audio mediante un'applicazione a riga di comando.
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.

Mostriamo un esempio pratico:

Private bo As Boolean


Public Sub Main()
  
 Dim pl As MediaPipeline
 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()
  
 While Not bo
' Mostra in console/terminale il tempo trascorso dall'inizio della ripresa audio-video:
   Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Flush
   Wait 0.01
 Wend

 pl.Stop()
 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
  
 bo = True
  
End