Salvare in un file OGV una ripresa video mediante una WebCam con il Componente gb.media

Da Gambas-it.org - Wikipedia.

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, the, ogg, snk As MediaControl
 Dim ftr As MediaFilter
 Dim primofile As String
  
  bo = True
  primofile = "/tmp/primofile"
  
  pl = New MediaPipeline 
  
  src = New MediaControl(pl, "v4l2src")
  ftr = New MediaFilter(pl, "video/x-raw,width=640,height=480,framerate=1/1")
  the = New MediaControl(pl, "theoraenc")
  ogg = New MediaControl(pl, "oggmux")
  ogg["name"] = "mux"
  snk = New MediaControl(pl, "filesink")
  snk["location"] = primofile
 
' Colleghiamo fra loro i plugin di "GStreamer":
  src.LinkTo(ftr)
  ftr.LinkTo(the)
  the.LinkTo(ogg)
  ogg.LinkTo(snk)
  
' Avvia la ripresa video:
  pl.Play()
  
  While bo
' Il tempo trascorso dall'inizio della ripresa video viene mostrato in console/Terminale:
    Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
    Wait 0.001
  Wend
  
  Copy primofile To "/tmp/file.ogv"
  pl.Stop()
  pl.Close
  
  Print "\nTermine registrazione"
  Quit
     
End


Public Sub Application_Read()
 
 Dim s As String
  
  Input s
  
  bo = False
  
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 comprensivo 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.


Mostriamo un esempio pratico:

Private bo As Boolean


Public Sub Main()
  
 Dim pl As MediaPipeline
 Dim Dim srcv, rat, que1, the, que2, srca, que3, con, vor, que4, ogg, snk As MediaControl
 Dim flv, fla As MediaFilter
 Dim primofile As String
 
  primofile = "/tmp/primofile"
     
  pl = New MediaPipeline 
  
  srcv = New MediaControl(pl, "v4l2src")
  rat = New MediaControl(pl, "videorate")
  flv = New MediaFilter(pl, "video/x-raw,framerate=1/1")
  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")
  con = 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"] = primofile
  
' Parte video:
  srcv.LinkTo(rat)
  rat.LinkTo(flv)
  flv.LinkTo(que1)
  que1.LinkTo(the)
  the.LinkTo(que2)
  que2.LinkTo(ogg)
' Parte video:
  srca.LinkTo(fla)
  fla.LinkTo(que3)
  que3.LinkTo(con)
  con.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()
  
  Repeat
' MOstra in console/terminale il tempo trascorso dall'inizio della ripresa audio-video:
    Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
    Wait 0.001
  Until bo = True
  
  Copy primofile To "/tmp/file.ogv"
  pl.Stop()
  pl.Close()
  Print "\nTermine registrazione"
  Quit
  
End


Public Sub Application_Read()
  
  bo = True
  
End