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

Da Gambas-it.org - Wikipedia.
 
(6 versioni intermedie di uno stesso utente non sono mostrate)
Riga 11: Riga 11:
 
   Dim src, cnv, the, ogg, snk As MediaControl
 
   Dim src, cnv, the, ogg, snk As MediaControl
 
   Dim ftr As MediaFilter
 
   Dim ftr As MediaFilter
   Dim appoggio As String
+
   Dim temporaneo As String
 
    
 
    
   bo = True
+
   temporaneo = Temp
  appoggio = Temp
 
 
    
 
    
 
   pl = New MediaPipeline  
 
   pl = New MediaPipeline  
Riga 20: Riga 19:
 
   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=1/1")
+
   ftr = New MediaFilter(pl, "video/x-raw,width=640,height=480,framerate=30/1")
 
   cnv = New MediaControl(pl, "videoconvert")
 
   cnv = New MediaControl(pl, "videoconvert")
 
   the = New MediaControl(pl, "theoraenc")
 
   the = New MediaControl(pl, "theoraenc")
Riga 26: Riga 25:
 
   ogg["name"] = "mux"
 
   ogg["name"] = "mux"
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
   snk["location"] = appoggio
+
   snk["location"] = temporaneo
 
    
 
    
 
  <FONT Color=gray>' ''Collega fra loro i plugin di "GStreamer":''</font>
 
  <FONT Color=gray>' ''Collega fra loro i plugin di "GStreamer":''</font>
Riga 38: Riga 37:
 
   pl.Play()
 
   pl.Play()
 
    
 
    
   While bo
+
   While Not bo
 
  <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: " & Time(0, 0, 0, pl.Position * 1000)
+
     Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
     Wait 0.001
+
    Flush
 +
     Wait 0.01
 
   Wend
 
   Wend
 
    
 
    
   Copy appoggio To "/tmp/file.ogv"
+
   Copy temporaneo To "/tmp/file.ogv"
 
   pl.Stop()
 
   pl.Stop()
 
   pl.Close
 
   pl.Close
 
    
 
    
 
   Print "\nTermine registrazione"
 
   Print "\nTermine registrazione"
 +
 +
<FONT Color=gray>' ''Avendo usato l'Evento "Application_Read(),", per terminale il programma si dovrà invocare il comando "Quit":''</font>
 
   Quit
 
   Quit
 
        
 
        
Riga 55: Riga 57:
 
  '''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 = False
+
   bo = True
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 65: Riga 67:
 
<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.
 
<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.
  
Va anche sottolineato che il valore del rapporto assegnato alla proprietà "framerate" dell'elemento ''MediaFilter'', relativo al blocco del video, deve tenersi tra 4/1 e 16/1, pena un'interruzione dell'audio.
+
Va anche sottolineato che il valore del rapporto assegnato alla Proprietà "framerate" dell'elemento ''MediaFilter'', relativo al blocco del video, è opportuno impostare molto basso il valore, pena un'interruzione dell'audio.
  
 
Mostriamo un esempio pratico:
 
Mostriamo un esempio pratico:
Riga 74: Riga 76:
 
    
 
    
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
   Dim Dim srcv, rat, que1, the, que2, srca, que3, con, 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
   Dim appoggio As String
+
   Dim temporaneo As String
 
    
 
    
   appoggio = Temp
+
   temporaneo = Temp
 
      
 
      
 
   pl = New MediaPipeline  
 
   pl = New MediaPipeline  
Riga 84: Riga 86:
 
   srcv = New MediaControl(pl, "v4l2src")
 
   srcv = New MediaControl(pl, "v4l2src")
 
   rat = New MediaControl(pl, "videorate")
 
   rat = New MediaControl(pl, "videorate")
   flv = New MediaFilter(pl, "video/x-raw,framerate=16/1")
+
   flv = New MediaFilter(pl, "video/x-raw,framerate=2/1")
 
   que1 = New MediaControl(pl, "queue")
 
   que1 = New MediaControl(pl, "queue")
 +
  vcon = New MediaControl(pl, "videoconvert")
 
   the = New MediaControl(pl, "theoraenc")
 
   the = New MediaControl(pl, "theoraenc")
 
   que2 = New MediaControl(pl, "queue")
 
   que2 = New MediaControl(pl, "queue")
Riga 91: Riga 94:
 
   fla = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2,width=16,depth=16")
 
   fla = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2,width=16,depth=16")
 
   que3 = New MediaControl(pl, "queue")
 
   que3 = New MediaControl(pl, "queue")
   con = New MediaControl(pl, "audioconvert")
+
   acon = New MediaControl(pl, "audioconvert")
 
   vor = New MediaControl(pl, "vorbisenc")
 
   vor = New MediaControl(pl, "vorbisenc")
 
   que4 = New MediaControl(pl, "queue")
 
   que4 = New MediaControl(pl, "queue")
 
   ogg = New MediaControl(pl, "oggmux")
 
   ogg = New MediaControl(pl, "oggmux")
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
   snk["location"] = appoggio
+
   snk["location"] = temporaneo
 
    
 
    
 
  <FONT Color=gray>' ''Parte video:''</font>
 
  <FONT Color=gray>' ''Parte video:''</font>
Riga 102: Riga 105:
 
   rat.LinkTo(flv)
 
   rat.LinkTo(flv)
 
   flv.LinkTo(que1)
 
   flv.LinkTo(que1)
   que1.LinkTo(the)
+
   que1.LinkTo(vcon)
 +
  vcon.LinkTo(the)
 
   the.LinkTo(que2)
 
   the.LinkTo(que2)
 
   que2.LinkTo(ogg)
 
   que2.LinkTo(ogg)
Riga 108: Riga 112:
 
   srca.LinkTo(fla)
 
   srca.LinkTo(fla)
 
   fla.LinkTo(que3)
 
   fla.LinkTo(que3)
   que3.LinkTo(con)
+
   que3.LinkTo(acon)
   con.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>
Riga 119: Riga 123:
 
   pl.Play()
 
   pl.Play()
 
    
 
    
   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 "\rTempo: " & Time(0, 0, 0, pl.Position * 1000)
+
     Write "\rTempo: " & Str(Time(0, 0, 0, pl.Position * 1000))
 +
    Flush
 
     Wait 0.01
 
     Wait 0.01
   Until bo
+
   Wend
 
    
 
    
   Copy appoggio To "/tmp/file.ogv"
+
   Copy temporaneo To "/tmp/file.ogv"
 
   pl.Stop()
 
   pl.Stop()
 
   pl.Close()
 
   pl.Close()

Versione attuale delle 10:50, 17 mag 2023

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

Ripresa video "senza" audio

Vediamo un esempio di ripresa video priva di audio con un'applicazione a riga di comando:

Private bo As Boolean


Public Sub Main()
  
 Dim pl As MediaPipeline
 Dim src, cnv, the, ogg, snk As MediaControl
 Dim ftr As MediaFilter
 Dim temporaneo As String
  
 temporaneo = Temp
 
 pl = New MediaPipeline 
 
 src = New MediaControl(pl, "v4l2src")
 src["device"] = "/dev/video0"
 ftr = New MediaFilter(pl, "video/x-raw,width=640,height=480,framerate=30/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"] = temporaneo
 
' 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
  
 Copy temporaneo To "/tmp/file.ogv"
 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 comprensiva di traccia audio

Vediamo un esempio di ripresa video comprensiva di traccia audio con 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.

Va anche sottolineato che il valore del rapporto assegnato alla Proprietà "framerate" dell'elemento MediaFilter, relativo al blocco del video, è opportuno impostare molto basso il valore, pena un'interruzione dell'audio.

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
 Dim temporaneo As String
 
 temporaneo = Temp
    
 pl = New MediaPipeline 
  
 srcv = New MediaControl(pl, "v4l2src")
 rat = New MediaControl(pl, "videorate")
 flv = New MediaFilter(pl, "video/x-raw,framerate=2/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"] = temporaneo
 
' 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 .ogv 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
  
 Copy temporaneo To "/tmp/file.ogv"
 pl.Stop()
 pl.Close()
 Print "\nTermine registrazione"
 Quit
  
End

Public Sub Application_Read()  ' Cliccando sul tasto "Invio" della tastiera, si solleverà questo Evento:
  
 bo = True
  
End