Differenze tra le versioni di "Salvare in un file video con il Componente gb.media una ripresa video effettuata da una WebCam"
Riga 179: | Riga 179: | ||
==Salvare in un file video di formato "MP4"== | ==Salvare in un file video di formato "MP4"== | ||
− | + | Private bo As Boolean | |
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 192: | Riga 193: | ||
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 203: | Riga 205: | ||
enc.LinkTo(mux) | enc.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() | ||
Riga 217: | Riga 211: | ||
tm = Now | tm = Now | ||
− | While | + | While Not bo |
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 224: | Riga 218: | ||
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 233: | Riga 230: | ||
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 | |
− | + | ||
− | |||
− | |||
− | |||
End | End | ||
Versione delle 08:29, 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.
Indice
- 1 Salvare in un file video di formato "AVI"
- 2 Salvare in un file video di formato "FLV"
- 3 Salvare in un file video di formato "MKV" (Matroska)
- 4 Salvare in un file video di formato "MP4"
- 5 Salvare in un file video di formato "OGG-Theora"
- 6 Ripresa video e creazione di un file audio/video di formato "OGG-Theora"
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