Differenze tra le versioni di "Eseguire i file video con il Componente gb.media"
(52 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
Il componente '''gb.media''' offre la possibilità di sfruttare le funzionalità della piattaforma multimediale modulare ''GStreamer'' per la gestione di file video. | Il componente '''gb.media''' offre la possibilità di sfruttare le funzionalità della piattaforma multimediale modulare ''GStreamer'' per la gestione di file video. | ||
− | + | E' possibile eseguire i file video utilizzando la Classe ''MediaPlayer'' oppure le risorse delle Classi ''MediaPipeline'' e ''MediaControl''. | |
− | ==Eseguire il video in uno specifico controllo GUI posto sul form== | + | Si potrà scegliere se far mostrare il video in un controllo GUI (ad esempio una ''DrawingArea'') posto sul Form, oppure in una finestra automaticamente aperta dalle risorse del componente ''gb.media''. |
+ | |||
+ | Assicurarsi che siano installati nel proprio sistema i seguenti plugin di GStreamer: | ||
+ | * gstreamer1.0-plugins-good | ||
+ | * gstreamer1.0-plugins-bad | ||
+ | * gstreamer1.0-plugins-ugly | ||
+ | * gst-libav | ||
+ | |||
+ | =Eseguire un video con la Classe ''MediaPlayer''= | ||
+ | Mostreremo di seguito alcuni esempi per eseguire un file video mediante le risorse della Classe ''MediaPlayer''. | ||
+ | |||
+ | |||
+ | Gli elementi essenziali per eseguire un file video con la Classe ''MediaPlayer'' sono: | ||
+ | * la Proprietà ".Url" per caricare il file (se il file è memorizzato su dispositivo di memoria, allora il suo percorso andrà passato mediante il Metodo ".Url" della Classe statica "Media"; se il file è eseguito da un indirizzo web, allora sarà passato direttamente l'indirizzo web); | ||
+ | * il Metodo ".Play()" per avviare l'esecuzione del file video; | ||
+ | * la Proprietà ".Duration" per far eseguire il file video per l'intera sua durata; | ||
+ | * il Metodo ".Close()" per chiudere il mediaplayer. | ||
+ | |||
+ | ===Eseguire un video in un'applicazione ''a linea di comando''=== | ||
+ | Vediamo ora un esempio con un'applicazione ''a linea di comando''. | ||
+ | <BR>Si potrà chiudere il programma durante l'esecuzione del file video semplicemente premendo sul tasto "Invio": | ||
+ | Private mp As MediaPlayer | ||
+ | Private bo As Boolean | ||
+ | |||
+ | |||
+ | Public Sub Main() | ||
+ | |||
+ | With mp = New MediaPlayer As "MPlayer" | ||
+ | .URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/video''</font>") | ||
+ | .Play() | ||
+ | Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) | ||
+ | Repeat | ||
+ | Wait 0.01 | ||
+ | Until bo | ||
+ | .Stop | ||
+ | .Close | ||
+ | End With | ||
+ | |||
+ | <FONT color=gray>' ''Avendo utilizzato l'Evento "Application_Read()", è necessario invocare l'istruzione "Quit" per terminare il programma:''</font> | ||
+ | Quit | ||
+ | |||
+ | End | ||
+ | |||
+ | Public Sub MPlayer_Position() | ||
+ | |||
+ | <FONT color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:''</font> | ||
+ | Write "\r\e[0mTempo trascorso: \e[1m\e[31m" & Str(Time(0, 0, 0, mp.Position * 1000)) | ||
+ | Flush | ||
+ | |||
+ | End | ||
+ | |||
+ | Public Sub Application_Read() <FONT color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
+ | |||
+ | ===Eseguire il video in uno specifico controllo GUI posto sul form=== | ||
Nel seguente esempio il video verrà mostrato in all'interno di uno specifico controllo GUI (ad esempio una ''DrawingArea'') posto sul Form: | Nel seguente esempio il video verrà mostrato in all'interno di uno specifico controllo GUI (ad esempio una ''DrawingArea'') posto sul Form: | ||
Private mp As MediaPlayer | Private mp As MediaPlayer | ||
− | |||
− | + | ||
+ | Public Sub Form_Open() | ||
Dim da As DrawingArea | Dim da As DrawingArea | ||
<FONT color=gray>' ''Crea una "DrawingArea" come oggetto GUI da usare per l'uscita video:''</font> | <FONT color=gray>' ''Crea una "DrawingArea" come oggetto GUI da usare per l'uscita video:''</font> | ||
− | + | With da = New DrawingArea(Me) | |
− | + | .X = 10 | |
− | + | .Y = 10 | |
− | + | .W = 480 | |
− | + | .H = 320 | |
− | + | End With | |
− | |||
− | + | With mp = New MediaPlayer As "MPlayer" | |
− | + | .URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/video''</font>") | |
<FONT color=gray>' ''Imposta il controllo dell'uscita video da usare:''</font> | <FONT color=gray>' ''Imposta il controllo dell'uscita video da usare:''</font> | ||
− | + | .SetWindow(da) ' <SUP>[[[#Note|nota 1]]]</sup> | |
− | + | End With | |
− | + | End | |
− | + | Public Sub MPlayer_Position() | |
− | |||
− | + | Me.Title = "Durata del video: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) & | |
− | + | " - Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000)) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | End | |
− | + | Public Sub Button1_Click() | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | <FONT color=gray>' ''Esegue il file video:''</font> | ||
+ | mp.Play() | ||
− | + | End | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Public Sub Button2_Click() | |
− | |||
− | |||
− | |||
− | |||
− | + | mp.Stop | |
− | + | mp.Close | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | End | |
+ | Public Sub ToggleButton1_Click() | ||
− | ''' | + | If ToggleButton1.Value Then |
− | + | mp.Pause | |
− | + | Else | |
− | + | mp.Play | |
− | + | Endif | |
− | + | ||
− | + | End | |
− | + | ====Eseguire il video in una finestra automaticamente aperta da ''Gstreamer''==== | |
− | + | Analogamente all'esecuzione in un'applicazione ''a riga di comando'' è possibile far mostrare il video in una finestra aperta in modo automatico da ''Gstreamer'' all'esterno del Form. | |
− | + | <BR>Per ottenere questo risultato in un'applicazione in ambiente grafico ovviamente non dovrà essere impostato alcuno specifico controllo GUI, ove reindirizzare l'uscita video. | |
− | + | ||
− | + | Anche questa finestra, volendo, può essere gestita mediante le Classi ''Desktop'' e ''DesktopWindow'' attivando i componenti ''gb.desktop'' e ''gb.desktop.x11''. | |
− | + | ||
− | + | ===Esecuzione di un video da un indirizzo web=== | |
− | + | Va precisato che, se il video da eseguire ha un indirizzo web, allora alla Proprietà ".Url" della Classe ''MediaPlayer'' va passato direttamente l'indirizzo web del video: | |
− | + | With mp = New MediaPlayer | |
+ | <FONT Color=#B222222>.URL</font> = "https://gstreamer.freedesktop.org/media/sintel_cropped_multilingual.webm" | ||
+ | ...... | ||
+ | |||
+ | =Eseguire un file video usando la Classe ''MediaPipeline'' e ''MediaControl''= | ||
+ | Di seguito mostreremo l'uso della Classe ''MediaPipeline'' e ''MediaControl'' con il plugin "playbin" e con il plugin "decodebin". | ||
+ | ==Uso del plugin "playbin"== | ||
+ | Mostriamo due esempi, nei quali il flusso audio-video sarà gestito dal plugin "playbin" di GStreamer richiamando le Classi ''MediaPipeline'' e ''MediaControl''. | ||
− | == | + | ===Con applicazione a "riga di comando"=== |
− | + | Private pl As MediaPipeline | |
− | |||
− | Private | ||
− | '' | + | Public Sub Main() |
+ | |||
+ | Dim pbn As MediaControl | ||
+ | Dim filevideo As String | ||
+ | |||
+ | filevideo = Uri("<FONT Color=darkgreen>''/percorso/del/file/video''</font>") | ||
+ | |||
+ | pl = New MediaPipeline As "Pipe" | ||
− | + | pbn = New MediaControl(pl, "playbin") | |
− | + | pbn["uri"] = filevideo | |
− | + | pbn["volume"] = 0.6 <FONT Color=gray>' ''Volume: da 0.00 a 1.0''</font> | |
− | |||
− | |||
− | |||
− | + | pl.Play | |
− | |||
− | |||
− | |||
− | + | Print "\r\e[0mDurata del video: "; Time(0, 0, 0, pl.Duration * 1000) | |
− | |||
− | |||
− | |||
− | + | <FONT color=gray>' ''Pone un'attesa pari alla durata del video, per farlo eseguire sino alla fine:''</font> | |
− | + | Wait pl.Duration | |
− | ''' | + | pl.Stop |
+ | pl.Close | ||
+ | <FONT Color=gray>' ''Consente di terminare il programma evitando l'uso di 'Quit'''</font> | ||
+ | pl = Null | ||
+ | Write "\n\e[0mEsecuzione terminata !" | ||
− | + | End | |
+ | |||
+ | Private Function Uri(s As String) As String | ||
− | + | Return "File:/" &/ s | |
− | + | End | |
− | |||
− | |||
− | |||
− | |||
− | + | ===Con applicazione grafica=== | |
+ | In quest'altro esempio utilizzeremo un progetto grafico, nel quale il video sarà mostrato all'interno di una "DrawingArea" posta sul "Form" principale | ||
Private pl As MediaPipeline | Private pl As MediaPipeline | ||
+ | Private bo As Boolean | ||
− | + | Public Sub Button1_Click() | |
− | Dim | + | Dim pbn As MediaControl |
Dim filevideo As String | Dim filevideo As String | ||
− | filevideo = Uri("<FONT Color= | + | filevideo = Uri("<FONT Color=darkgreen>''/percorso/del/file/video''</font>") |
pl = New MediaPipeline As "Pipe" | pl = New MediaPipeline As "Pipe" | ||
+ | |||
+ | pbn = New MediaControl(pl, "playbin") | ||
+ | pbn["uri"] = filevideo | ||
+ | pbn["volume"] = 0.6 <FONT Color=gray>' ''Volume: da 0.00 a 1.0''</font> | ||
+ | |||
+ | <FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font> | ||
+ | pbn.SetWindow(DrawingArea1) | ||
+ | |||
+ | pl.Play | ||
+ | |||
+ | Repeat | ||
+ | Wait 0.01 | ||
+ | Until bo | ||
+ | |||
+ | pl.Stop | ||
+ | pl.Close | ||
+ | |||
+ | Me.Text = "Esecuzione terminata !" | ||
+ | |||
+ | End | ||
+ | |||
+ | Private Function Uri(s As String) As String | ||
− | + | Return "File:/" &/ s | |
− | |||
− | |||
− | + | End | |
+ | |||
+ | Public Sub Pipe_Position() | ||
− | + | Me.Title = "Durata video: " & Str(Time(0, 0, 0, pl.Duration * 1000)) & | |
+ | " - Tempo trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
− | <FONT | + | End |
− | Wait pl. | + | |
+ | Public Sub Pipe_End() | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
+ | |||
+ | ===Esecuzione di un video da un indirizzo web=== | ||
+ | Va precisato che con il plug-in "playbin" alla sua Proprietà "<B>uri</b>" si passerà il percorso del file video, anticipato dal prefisso "File:/". | ||
+ | <BR>Se, invece, il video da eseguire ha un indirizzo web, allora alla predetta Proprietà "uri" va passato direttamente l'indirizzo web del video: | ||
+ | pbn = New MediaControl(pl, "playbin") | ||
+ | pbn["uri"] = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm" | ||
+ | ... | ||
+ | |||
+ | ==Uso del plugin "decodebin"== | ||
+ | E' possibile eseguire un video mediante l'uso del plugin "decodebin" di GStreamer e delle Classi "MediaPipeline" and "MediaControl" del Componente gb.media. | ||
+ | |||
+ | Mostriamo un esempio: | ||
+ | Private pl As MediaPipeline | ||
+ | Private bo As Boolean | ||
+ | |||
+ | |||
+ | Public Sub Button1_Click() | ||
+ | |||
+ | Dim src, vbin, vcon, vsnk, asrc, abin, acon, ares, asnk As MediaControl | ||
+ | Dim filevideo As String | ||
+ | |||
+ | filevideo = "<FONT Color=darkgreen>''/percorso/del/file/video''</font>" | ||
+ | |||
+ | pl = New MediaPipeline As "PLine" | ||
+ | |||
+ | src = New MediaControl(pl, "filesrc") | ||
+ | src["location"] = filevideo | ||
+ | |||
+ | <FONT Color=gray>' ''Imposta i necessari MediaControl:''</font> | ||
+ | vbin = New MediaControl(pl, "decodebin") | ||
+ | vcon = New MediaControl(pl, "videoconvert") | ||
+ | vsnk = New MediaControl(pl, "xvimagesink") | ||
+ | |||
+ | abin = New MediaControl(pl, "decodebin") | ||
+ | acon = New MediaControl(pl, "audioconvert") | ||
+ | ares = New MediaControl(pl, "audioresample") | ||
+ | asnk = New MediaControl(pl, "autoaudiosink") | ||
+ | |||
+ | <FONT Color=gray>' ''Connette i "MediaControl" precedentemente impostati:''</font> | ||
+ | src.LinkTo(vbin) | ||
+ | vbin.LinkLaterTo(vcon) | ||
+ | vcon.LinkTo(vsnk) | ||
+ | |||
+ | asrc = New MediaControl(pl, "filesrc") | ||
+ | asrc["location"] = filevideo | ||
+ | asrc.LinkTo(abin) | ||
+ | abin.LinkLaterTo(acon) | ||
+ | acon.LinkTo(ares) | ||
+ | ares.LinkTo(asnk) | ||
+ | |||
+ | <FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font> | ||
+ | vsnk.SetWindow(DrawingArea1) | ||
+ | |||
+ | pl.Play() | ||
+ | |||
+ | While Not bo | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | |||
+ | pl.Close | ||
− | pl. | + | End |
+ | |||
+ | Public Sub PLine_Position() | ||
+ | |||
+ | <FONT Color=gray>' ''Mostra il tempo trascorso dall'avvio del video:''</font> | ||
+ | Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss") | ||
+ | |||
+ | End | ||
+ | |||
+ | Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando la conversione è terminata''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
+ | ===Modificare la saturazione, la luminosità, la tonalità e il contrasto di un video=== | ||
+ | Per modificare la luminosità, il contrasto, la tonalità e la saturazione di un video, si userà l'elemento "videoBalance" di ''GStreamer'', gestendo le sue proprietà: ''brightness'', ''contrast'', ''hue'' e ''saturation''. | ||
+ | <BR>I valori da assegnare sono in virgola mobile (più precisamente dei ''Float'') e hanno rispettivamente i seguenti ambiti di valori applicabili | ||
+ | * "brightness" = da -1.0 a 1.0; | ||
+ | * "contrast" = da 0.0 a 2.0; | ||
+ | * "hue" = da -1.0 a 1.0; | ||
+ | * "saturation" = da 0.0 a 2.0 | ||
+ | |||
+ | Mostriamo un esempio pratico: | ||
+ | Private pl As MediaPipeline | ||
+ | Private bo As Boolean | ||
+ | |||
+ | |||
+ | Public Sub Button1_Click() | ||
+ | |||
+ | Dim src, vbin, vcon, vbal, vsnk As MediaControl | ||
+ | Dim asrc, abin, acon, ares, asnk As MediaControl | ||
+ | Dim filevideo As String | ||
+ | |||
+ | filevideo = "<FONT Color=darkgreen>''/percorso/del/filevideo''</font>" | ||
+ | |||
+ | pl = New MediaPipeline As "PLine" | ||
+ | |||
+ | src = New MediaControl(pl, "filesrc") | ||
+ | src["location"] = filevideo | ||
+ | |||
+ | <FONT Color=gray>' ''Imposta i necessari MediaControl:''</font> | ||
+ | vbin = New MediaControl(pl, "decodebin") | ||
+ | vcon = New MediaControl(pl, "videoconvert") | ||
+ | vbal = New MediaControl(pl, "videobalance") | ||
+ | <FONT Color=gray>' ''Imposta la luminosità del video (in questo caso lo scurisce):''</font> | ||
+ | vbal<FONT Color=red>["brightness"]= '''-0.4'''</font> | ||
+ | vsnk = New MediaControl(pl, "xvimagesink") | ||
+ | |||
+ | abin = New MediaControl(pl, "decodebin") | ||
+ | acon = New MediaControl(pl, "audioconvert") | ||
+ | ares = New MediaControl(pl, "audioresample") | ||
+ | asnk = New MediaControl(pl, "autoaudiosink") | ||
+ | |||
+ | <FONT Color=gray>' ''Connette i "MediaControl" precedentemente impostati:''</font> | ||
+ | src.LinkTo(vbin) | ||
+ | vbin.LinkLaterTo(vcon) | ||
+ | vcon.LinkTo(vbal) | ||
+ | vbal.LinkTo(vsnk) | ||
+ | |||
+ | asrc = New MediaControl(pl, "filesrc") | ||
+ | asrc["location"] = filevideo | ||
+ | asrc.LinkTo(abin) | ||
+ | abin.LinkLaterTo(acon) | ||
+ | acon.LinkTo(ares) | ||
+ | ares.LinkTo(asnk) | ||
+ | |||
+ | <FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font> | ||
+ | vsnk.SetWindow(DrawingArea1) | ||
+ | |||
+ | pl.Play() | ||
+ | |||
+ | While Not bo | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | |||
pl.Close | pl.Close | ||
− | |||
− | |||
− | + | End | |
+ | |||
+ | Public Sub PLine_Position() | ||
+ | |||
+ | <FONT Color=gray>' ''Mostra il tempo trascorso dall'avvio del video:''</font> | ||
+ | Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss") | ||
+ | |||
+ | End | ||
+ | |||
+ | Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando la conversione è terminata''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
+ | |||
+ | ===Ruotare un video=== | ||
+ | E' possibile ruotare un video mediante l'uso del plugin "decodebin" di GStreamer e delle Classi "MediaPipeline" and "MediaControl" del Componente gb.media. | ||
+ | |||
+ | ====Eseguire un video ruotato, nel quale non è possibile ascoltare l'eventuale audio==== | ||
+ | Mostriamo un esempio, precisando, però, che se il video contiene audio, questo non sarà ascoltabile. | ||
+ | Private Enum none = 0, clockwise, rotate_180, counterclockwise, horizontal_flip, | ||
+ | vertical_flip, upper_left_diagonal, upper_right_diagonal, automatic | ||
+ | Private pl As MediaPipeline | ||
+ | Private bo As Boolean | ||
+ | |||
+ | |||
+ | Public Sub Button1_Click() | ||
+ | |||
+ | Dim src, bin, con, flp, snk As MediaControl | ||
+ | |||
+ | pl = New MediaPipeline As "PLine" | ||
+ | |||
+ | src = New MediaControl(pl, "filesrc") | ||
+ | src["location"] = "<FONT Color=darkgreen>''/percorso/del/filevideo''</font>" | ||
+ | |||
+ | <FONT Color=gray>' ''Imposta i necessari MediaControl:''</font> | ||
+ | bin = New MediaControl(pl, "decodebin") | ||
+ | con = New MediaControl(pl, "videoconvert") | ||
+ | flp = New MediaControl(pl, "videoflip") | ||
+ | flp["method"] = clockwise | ||
+ | snk = New MediaControl(pl, "xvimagesink") | ||
+ | |||
+ | <FONT Color=gray>' ''Connette i "MediaControl" precedentemente impostati:''</font> | ||
+ | src.LinkTo(bin) | ||
+ | bin.LinkLaterTo(con) | ||
+ | con.LinkTo(flp) | ||
+ | flp.LinkTo(snk) | ||
+ | |||
+ | <FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font> | ||
+ | snk.SetWindow(DrawingArea1) | ||
+ | |||
+ | pl.Play() | ||
+ | |||
+ | While Not bo | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | |||
+ | pl.Close | ||
− | '''End''' | + | End |
+ | |||
+ | Public Sub PLine_Position() | ||
+ | |||
+ | <FONT Color=gray>' ''Mostra il tempo trascorso dall'avvio del video:''</font> | ||
+ | Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss") | ||
+ | |||
+ | End | ||
+ | |||
+ | Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando la conversione è terminata''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
+ | |||
+ | ====Eseguire un video ruotato, nel quale è possibile anche ascoltare l'eventuale audio==== | ||
+ | Con quest'altro codice, se il video contiene anche l'audio, questo sarà udibile: | ||
+ | Private Enum none = 0, clockwise, rotate_180, counterclockwise, horizontal_flip, | ||
+ | vertical_flip, upper_left_diagonal, upper_right_diagonal, automatic | ||
+ | Private pl As MediaPipeline | ||
+ | Private bo As Boolean | ||
+ | |||
+ | |||
+ | Public Sub Button1_Click() | ||
+ | |||
+ | Dim vsrc, vbin, vcon, vflp, vsnk, asrc, abin, acon, ares, asnk As MediaControl | ||
+ | Dim filevideo As String | ||
+ | |||
+ | filevideo = "<FONT Color=darkgreen>''/percorso/del/filevideo''</font>" | ||
+ | |||
+ | pl = New MediaPipeline | ||
+ | |||
+ | vsrc = New MediaControl(pl, "filesrc") | ||
+ | vsrc["location"] = filevideo | ||
+ | |||
+ | <FONT Color=gray>' ''Imposta i necessari MediaControl:''</font> | ||
+ | vbin = New MediaControl(pl, "decodebin") | ||
+ | vcon = New MediaControl(pl, "videoconvert") | ||
+ | vflp = New MediaControl(pl, "videoflip") | ||
+ | vflp["method"] = clockwise | ||
+ | vsnk = New MediaControl(pl, "xvimagesink") | ||
+ | |||
+ | abin = New MediaControl(pl, "decodebin") | ||
+ | acon = New MediaControl(pl, "audioconvert") | ||
+ | ares = New MediaControl(pl, "audioresample") | ||
+ | asnk = New MediaControl(pl, "autoaudiosink") | ||
+ | |||
+ | <FONT Color=gray>' ''Connette i "MediaControl" precedentemente impostati:''</font> | ||
+ | vsrc.LinkTo(vbin) | ||
+ | vbin.LinkLaterTo(vcon) | ||
+ | vcon.LinkTo(vflp) | ||
+ | vflp.LinkTo(vsnk) | ||
+ | |||
+ | asrc = New MediaControl(pl, "filesrc") | ||
+ | asrc["location"] = filevideo | ||
+ | asrc.LinkTo(abin) | ||
+ | abin.LinkLaterTo(acon) | ||
+ | acon.LinkTo(ares) | ||
+ | ares.LinkTo(asnk) | ||
− | ''' | + | <FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font> |
+ | vsnk.SetWindow(DrawingArea1) | ||
+ | |||
+ | pl.Play() | ||
+ | |||
+ | While Not bo | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | |||
+ | pl.Close | ||
− | + | End | |
+ | |||
+ | Public Sub PLine_Position() | ||
+ | |||
+ | <FONT Color=gray>' ''Mostra il tempo trascorso dall'avvio del video:''</font> | ||
+ | Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss") | ||
+ | |||
+ | End | ||
+ | |||
+ | Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando la conversione è terminata''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
+ | ===Eseguire un video tagliato ai suoi bordi=== | ||
+ | Il video può essere mostrato con tagli d'immagine ai suoi bordi. | ||
+ | <BR>Per ottenere questo effetto, si utilizzerà il plugin di ''Gstreamer'' "cropvideo", il quale ritaglia i fotogrammi video, cioè può rimuovere parti dell'immagine a sinistra, a destra, in alto o in basso e produrre un'immagine più piccola rispetto a quella di ingresso, con la rimozione delle parti indesiderate al bordo. | ||
+ | <BR>Se il video contiene anche l'audio, questo sarà udibile. | ||
+ | Private pl As MediaPipeline | ||
+ | Private bo As Boolean | ||
+ | |||
+ | |||
+ | Public Sub Button1_Click() | ||
+ | |||
+ | Dim src, vbin, vcon, vcro, vsnk As MediaControl | ||
+ | Dim asrc, abin, acon, ares, asnk As MediaControl | ||
+ | Dim filevideo As String | ||
+ | |||
+ | filevideo = "<FONT Color=darkgreen>''/percorso/del/filevideo''</font>" | ||
+ | |||
+ | pl = New MediaPipeline As "PLine" | ||
+ | |||
+ | src = New MediaControl(pl, "filesrc") | ||
+ | src["location"] = filevideo | ||
+ | |||
+ | <FONT Color=gray>' ''Imposta i necessari MediaControl:''</font> | ||
+ | vbin = New MediaControl(pl, "decodebin") | ||
+ | vcon = New MediaControl(pl, "videoconvert") | ||
+ | vcro = New MediaControl(pl, "videocrop") | ||
+ | <FONT Color=gray>' ''Imposta la quantità di pixel dei lati del video da tagliare:''</font> | ||
+ | vcro["top"]= 100 | ||
+ | vcro["left"] = 0 | ||
+ | vcro["right"] = 300 | ||
+ | vcro["bottom"] = 0 | ||
+ | vsnk = New MediaControl(pl, "xvimagesink") | ||
+ | |||
+ | abin = New MediaControl(pl, "decodebin") | ||
+ | acon = New MediaControl(pl, "audioconvert") | ||
+ | ares = New MediaControl(pl, "audioresample") | ||
+ | asnk = New MediaControl(pl, "autoaudiosink") | ||
+ | |||
+ | <FONT Color=gray>' ''Connette i "MediaControl" precedentemente impostati:''</font> | ||
+ | src.LinkTo(vbin) | ||
+ | vbin.LinkLaterTo(vcon) | ||
+ | vcon.LinkTo(vcro) | ||
+ | vcro.LinkTo(vsnk) | ||
+ | |||
+ | asrc = New MediaControl(pl, "filesrc") | ||
+ | asrc["location"] = filevideo | ||
+ | asrc.LinkTo(abin) | ||
+ | abin.LinkLaterTo(acon) | ||
+ | acon.LinkTo(ares) | ||
+ | ares.LinkTo(asnk) | ||
+ | |||
+ | <FONT Color=gray>' ''Imposta la superficie grafica ove mostrare il video:''</font> | ||
+ | vsnk.SetWindow(DrawingArea1) | ||
+ | |||
+ | pl.Play() | ||
+ | |||
+ | While Not bo | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | |||
+ | pl.Close | ||
− | '''End''' | + | End |
+ | |||
+ | Public Sub PLine_Position() | ||
+ | |||
+ | <FONT Color=gray>' ''Mostra il tempo trascorso dall'avvio del video:''</font> | ||
+ | Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss") | ||
+ | |||
+ | End | ||
+ | |||
+ | Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando la conversione è terminata''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
=Note= | =Note= | ||
− | [1] Riguardo all'Oggetto grafico da usare con il Metodo ".SetWindow()" della Classe "MediaPlayer", B. Minisini ha chiarito che esso necessita di un controllo che | + | [1] Riguardo all'Oggetto grafico da usare con il Metodo ".SetWindow()" della Classe "MediaPlayer", B. Minisini ha chiarito che esso necessita di un controllo che abbia una vera finestra X11 (o Wayland), altrimenti si userà il primo controllo ''genitore'' con una finestra reale, che di solito è quella di primo livello. |
Versione attuale delle 18:31, 9 gen 2024
Il componente gb.media offre la possibilità di sfruttare le funzionalità della piattaforma multimediale modulare GStreamer per la gestione di file video.
E' possibile eseguire i file video utilizzando la Classe MediaPlayer oppure le risorse delle Classi MediaPipeline e MediaControl.
Si potrà scegliere se far mostrare il video in un controllo GUI (ad esempio una DrawingArea) posto sul Form, oppure in una finestra automaticamente aperta dalle risorse del componente gb.media.
Assicurarsi che siano installati nel proprio sistema i seguenti plugin di GStreamer:
- gstreamer1.0-plugins-good
- gstreamer1.0-plugins-bad
- gstreamer1.0-plugins-ugly
- gst-libav
Indice
- 1 Eseguire un video con la Classe MediaPlayer
- 2 Eseguire un file video usando la Classe MediaPipeline e MediaControl
- 3 Note
Eseguire un video con la Classe MediaPlayer
Mostreremo di seguito alcuni esempi per eseguire un file video mediante le risorse della Classe MediaPlayer.
Gli elementi essenziali per eseguire un file video con la Classe MediaPlayer sono:
- la Proprietà ".Url" per caricare il file (se il file è memorizzato su dispositivo di memoria, allora il suo percorso andrà passato mediante il Metodo ".Url" della Classe statica "Media"; se il file è eseguito da un indirizzo web, allora sarà passato direttamente l'indirizzo web);
- il Metodo ".Play()" per avviare l'esecuzione del file video;
- la Proprietà ".Duration" per far eseguire il file video per l'intera sua durata;
- il Metodo ".Close()" per chiudere il mediaplayer.
Eseguire un video in un'applicazione a linea di comando
Vediamo ora un esempio con un'applicazione a linea di comando.
Si potrà chiudere il programma durante l'esecuzione del file video semplicemente premendo sul tasto "Invio":
Private mp As MediaPlayer Private bo As Boolean Public Sub Main() With mp = New MediaPlayer As "MPlayer" .URL = Media.URL("/percorso/del/file/video") .Play() Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) Repeat Wait 0.01 Until bo .Stop .Close End With ' Avendo utilizzato l'Evento "Application_Read()", è necessario invocare l'istruzione "Quit" per terminare il programma: Quit End Public Sub MPlayer_Position() ' Mostra in console la posizione, espressa in secondi, all'interno dei dati processati: Write "\r\e[0mTempo trascorso: \e[1m\e[31m" & Str(Time(0, 0, 0, mp.Position * 1000)) Flush End Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera, si arresta il programma bo = True End
Eseguire il video in uno specifico controllo GUI posto sul form
Nel seguente esempio il video verrà mostrato in all'interno di uno specifico controllo GUI (ad esempio una DrawingArea) posto sul Form:
Private mp As MediaPlayer Public Sub Form_Open() Dim da As DrawingArea ' Crea una "DrawingArea" come oggetto GUI da usare per l'uscita video: With da = New DrawingArea(Me) .X = 10 .Y = 10 .W = 480 .H = 320 End With With mp = New MediaPlayer As "MPlayer" .URL = Media.URL("/percorso/del/file/video") ' Imposta il controllo dell'uscita video da usare: .SetWindow(da) ' [nota 1] End With End Public Sub MPlayer_Position() Me.Title = "Durata del video: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000)) End Public Sub Button1_Click() ' Esegue il file video: mp.Play() End Public Sub Button2_Click() mp.Stop mp.Close End Public Sub ToggleButton1_Click() If ToggleButton1.Value Then mp.Pause Else mp.Play Endif End
Eseguire il video in una finestra automaticamente aperta da Gstreamer
Analogamente all'esecuzione in un'applicazione a riga di comando è possibile far mostrare il video in una finestra aperta in modo automatico da Gstreamer all'esterno del Form.
Per ottenere questo risultato in un'applicazione in ambiente grafico ovviamente non dovrà essere impostato alcuno specifico controllo GUI, ove reindirizzare l'uscita video.
Anche questa finestra, volendo, può essere gestita mediante le Classi Desktop e DesktopWindow attivando i componenti gb.desktop e gb.desktop.x11.
Esecuzione di un video da un indirizzo web
Va precisato che, se il video da eseguire ha un indirizzo web, allora alla Proprietà ".Url" della Classe MediaPlayer va passato direttamente l'indirizzo web del video:
With mp = New MediaPlayer .URL = "https://gstreamer.freedesktop.org/media/sintel_cropped_multilingual.webm" ......
Eseguire un file video usando la Classe MediaPipeline e MediaControl
Di seguito mostreremo l'uso della Classe MediaPipeline e MediaControl con il plugin "playbin" e con il plugin "decodebin".
Uso del plugin "playbin"
Mostriamo due esempi, nei quali il flusso audio-video sarà gestito dal plugin "playbin" di GStreamer richiamando le Classi MediaPipeline e MediaControl.
Con applicazione a "riga di comando"
Private pl As MediaPipeline Public Sub Main() Dim pbn As MediaControl Dim filevideo As String filevideo = Uri("/percorso/del/file/video") pl = New MediaPipeline As "Pipe" pbn = New MediaControl(pl, "playbin") pbn["uri"] = filevideo pbn["volume"] = 0.6 ' Volume: da 0.00 a 1.0 pl.Play Print "\r\e[0mDurata del video: "; Time(0, 0, 0, pl.Duration * 1000) ' Pone un'attesa pari alla durata del video, per farlo eseguire sino alla fine: Wait pl.Duration pl.Stop pl.Close ' Consente di terminare il programma evitando l'uso di 'Quit' pl = Null Write "\n\e[0mEsecuzione terminata !" End Private Function Uri(s As String) As String Return "File:/" &/ s End
Con applicazione grafica
In quest'altro esempio utilizzeremo un progetto grafico, nel quale il video sarà mostrato all'interno di una "DrawingArea" posta sul "Form" principale
Private pl As MediaPipeline Private bo As Boolean Public Sub Button1_Click() Dim pbn As MediaControl Dim filevideo As String filevideo = Uri("/percorso/del/file/video") pl = New MediaPipeline As "Pipe" pbn = New MediaControl(pl, "playbin") pbn["uri"] = filevideo pbn["volume"] = 0.6 ' Volume: da 0.00 a 1.0 ' Imposta la superficie grafica ove mostrare il video: pbn.SetWindow(DrawingArea1) pl.Play Repeat Wait 0.01 Until bo pl.Stop pl.Close Me.Text = "Esecuzione terminata !" End Private Function Uri(s As String) As String Return "File:/" &/ s End Public Sub Pipe_Position() Me.Title = "Durata video: " & Str(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000)) End Public Sub Pipe_End() bo = True End
Esecuzione di un video da un indirizzo web
Va precisato che con il plug-in "playbin" alla sua Proprietà "uri" si passerà il percorso del file video, anticipato dal prefisso "File:/".
Se, invece, il video da eseguire ha un indirizzo web, allora alla predetta Proprietà "uri" va passato direttamente l'indirizzo web del video:
pbn = New MediaControl(pl, "playbin") pbn["uri"] = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm" ...
Uso del plugin "decodebin"
E' possibile eseguire un video mediante l'uso del plugin "decodebin" di GStreamer e delle Classi "MediaPipeline" and "MediaControl" del Componente gb.media.
Mostriamo un esempio:
Private pl As MediaPipeline Private bo As Boolean Public Sub Button1_Click() Dim src, vbin, vcon, vsnk, asrc, abin, acon, ares, asnk As MediaControl Dim filevideo As String filevideo = "/percorso/del/file/video" pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = filevideo ' Imposta i necessari MediaControl: vbin = New MediaControl(pl, "decodebin") vcon = New MediaControl(pl, "videoconvert") vsnk = New MediaControl(pl, "xvimagesink") abin = New MediaControl(pl, "decodebin") acon = New MediaControl(pl, "audioconvert") ares = New MediaControl(pl, "audioresample") asnk = New MediaControl(pl, "autoaudiosink") ' Connette i "MediaControl" precedentemente impostati: src.LinkTo(vbin) vbin.LinkLaterTo(vcon) vcon.LinkTo(vsnk) asrc = New MediaControl(pl, "filesrc") asrc["location"] = filevideo asrc.LinkTo(abin) abin.LinkLaterTo(acon) acon.LinkTo(ares) ares.LinkTo(asnk) ' Imposta la superficie grafica ove mostrare il video: vsnk.SetWindow(DrawingArea1) pl.Play() While Not bo Wait 0.01 Wend pl.Close End Public Sub PLine_Position() ' Mostra il tempo trascorso dall'avvio del video: Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss") End Public Sub PLine_End() ' Questo Evento viene sollevato, quando la conversione è terminata bo = True End
Modificare la saturazione, la luminosità, la tonalità e il contrasto di un video
Per modificare la luminosità, il contrasto, la tonalità e la saturazione di un video, si userà l'elemento "videoBalance" di GStreamer, gestendo le sue proprietà: brightness, contrast, hue e saturation.
I valori da assegnare sono in virgola mobile (più precisamente dei Float) e hanno rispettivamente i seguenti ambiti di valori applicabili
- "brightness" = da -1.0 a 1.0;
- "contrast" = da 0.0 a 2.0;
- "hue" = da -1.0 a 1.0;
- "saturation" = da 0.0 a 2.0
Mostriamo un esempio pratico:
Private pl As MediaPipeline Private bo As Boolean Public Sub Button1_Click() Dim src, vbin, vcon, vbal, vsnk As MediaControl Dim asrc, abin, acon, ares, asnk As MediaControl Dim filevideo As String filevideo = "/percorso/del/filevideo" pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = filevideo ' Imposta i necessari MediaControl: vbin = New MediaControl(pl, "decodebin") vcon = New MediaControl(pl, "videoconvert") vbal = New MediaControl(pl, "videobalance") ' Imposta la luminosità del video (in questo caso lo scurisce): vbal["brightness"]= -0.4 vsnk = New MediaControl(pl, "xvimagesink") abin = New MediaControl(pl, "decodebin") acon = New MediaControl(pl, "audioconvert") ares = New MediaControl(pl, "audioresample") asnk = New MediaControl(pl, "autoaudiosink") ' Connette i "MediaControl" precedentemente impostati: src.LinkTo(vbin) vbin.LinkLaterTo(vcon) vcon.LinkTo(vbal) vbal.LinkTo(vsnk) asrc = New MediaControl(pl, "filesrc") asrc["location"] = filevideo asrc.LinkTo(abin) abin.LinkLaterTo(acon) acon.LinkTo(ares) ares.LinkTo(asnk) ' Imposta la superficie grafica ove mostrare il video: vsnk.SetWindow(DrawingArea1) pl.Play() While Not bo Wait 0.01 Wend pl.Close End Public Sub PLine_Position() ' Mostra il tempo trascorso dall'avvio del video: Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss") End Public Sub PLine_End() ' Questo Evento viene sollevato, quando la conversione è terminata bo = True End
Ruotare un video
E' possibile ruotare un video mediante l'uso del plugin "decodebin" di GStreamer e delle Classi "MediaPipeline" and "MediaControl" del Componente gb.media.
Eseguire un video ruotato, nel quale non è possibile ascoltare l'eventuale audio
Mostriamo un esempio, precisando, però, che se il video contiene audio, questo non sarà ascoltabile.
Private Enum none = 0, clockwise, rotate_180, counterclockwise, horizontal_flip, vertical_flip, upper_left_diagonal, upper_right_diagonal, automatic Private pl As MediaPipeline Private bo As Boolean Public Sub Button1_Click() Dim src, bin, con, flp, snk As MediaControl pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/filevideo" ' Imposta i necessari MediaControl: bin = New MediaControl(pl, "decodebin") con = New MediaControl(pl, "videoconvert") flp = New MediaControl(pl, "videoflip") flp["method"] = clockwise snk = New MediaControl(pl, "xvimagesink") ' Connette i "MediaControl" precedentemente impostati: src.LinkTo(bin) bin.LinkLaterTo(con) con.LinkTo(flp) flp.LinkTo(snk) ' Imposta la superficie grafica ove mostrare il video: snk.SetWindow(DrawingArea1) pl.Play() While Not bo Wait 0.01 Wend pl.Close End Public Sub PLine_Position() ' Mostra il tempo trascorso dall'avvio del video: Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss") End Public Sub PLine_End() ' Questo Evento viene sollevato, quando la conversione è terminata bo = True End
Eseguire un video ruotato, nel quale è possibile anche ascoltare l'eventuale audio
Con quest'altro codice, se il video contiene anche l'audio, questo sarà udibile:
Private Enum none = 0, clockwise, rotate_180, counterclockwise, horizontal_flip, vertical_flip, upper_left_diagonal, upper_right_diagonal, automatic Private pl As MediaPipeline Private bo As Boolean Public Sub Button1_Click() Dim vsrc, vbin, vcon, vflp, vsnk, asrc, abin, acon, ares, asnk As MediaControl Dim filevideo As String filevideo = "/percorso/del/filevideo" pl = New MediaPipeline vsrc = New MediaControl(pl, "filesrc") vsrc["location"] = filevideo ' Imposta i necessari MediaControl: vbin = New MediaControl(pl, "decodebin") vcon = New MediaControl(pl, "videoconvert") vflp = New MediaControl(pl, "videoflip") vflp["method"] = clockwise vsnk = New MediaControl(pl, "xvimagesink") abin = New MediaControl(pl, "decodebin") acon = New MediaControl(pl, "audioconvert") ares = New MediaControl(pl, "audioresample") asnk = New MediaControl(pl, "autoaudiosink") ' Connette i "MediaControl" precedentemente impostati: vsrc.LinkTo(vbin) vbin.LinkLaterTo(vcon) vcon.LinkTo(vflp) vflp.LinkTo(vsnk) asrc = New MediaControl(pl, "filesrc") asrc["location"] = filevideo asrc.LinkTo(abin) abin.LinkLaterTo(acon) acon.LinkTo(ares) ares.LinkTo(asnk) ' Imposta la superficie grafica ove mostrare il video: vsnk.SetWindow(DrawingArea1) pl.Play() While Not bo Wait 0.01 Wend pl.Close End Public Sub PLine_Position() ' Mostra il tempo trascorso dall'avvio del video: Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss") End Public Sub PLine_End() ' Questo Evento viene sollevato, quando la conversione è terminata bo = True End
Eseguire un video tagliato ai suoi bordi
Il video può essere mostrato con tagli d'immagine ai suoi bordi.
Per ottenere questo effetto, si utilizzerà il plugin di Gstreamer "cropvideo", il quale ritaglia i fotogrammi video, cioè può rimuovere parti dell'immagine a sinistra, a destra, in alto o in basso e produrre un'immagine più piccola rispetto a quella di ingresso, con la rimozione delle parti indesiderate al bordo.
Se il video contiene anche l'audio, questo sarà udibile.
Private pl As MediaPipeline Private bo As Boolean Public Sub Button1_Click() Dim src, vbin, vcon, vcro, vsnk As MediaControl Dim asrc, abin, acon, ares, asnk As MediaControl Dim filevideo As String filevideo = "/percorso/del/filevideo" pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = filevideo ' Imposta i necessari MediaControl: vbin = New MediaControl(pl, "decodebin") vcon = New MediaControl(pl, "videoconvert") vcro = New MediaControl(pl, "videocrop") ' Imposta la quantità di pixel dei lati del video da tagliare: vcro["top"]= 100 vcro["left"] = 0 vcro["right"] = 300 vcro["bottom"] = 0 vsnk = New MediaControl(pl, "xvimagesink") abin = New MediaControl(pl, "decodebin") acon = New MediaControl(pl, "audioconvert") ares = New MediaControl(pl, "audioresample") asnk = New MediaControl(pl, "autoaudiosink") ' Connette i "MediaControl" precedentemente impostati: src.LinkTo(vbin) vbin.LinkLaterTo(vcon) vcon.LinkTo(vcro) vcro.LinkTo(vsnk) asrc = New MediaControl(pl, "filesrc") asrc["location"] = filevideo asrc.LinkTo(abin) abin.LinkLaterTo(acon) acon.LinkTo(ares) ares.LinkTo(asnk) ' Imposta la superficie grafica ove mostrare il video: vsnk.SetWindow(DrawingArea1) pl.Play() While Not bo Wait 0.01 Wend pl.Close End Public Sub PLine_Position() ' Mostra il tempo trascorso dall'avvio del video: Me.Title = "Tempo: " & Format(Time(0, 0, 0, pl.Position * 1000), "hh:nn:ss") End Public Sub PLine_End() ' Questo Evento viene sollevato, quando la conversione è terminata bo = True End
Note
[1] Riguardo all'Oggetto grafico da usare con il Metodo ".SetWindow()" della Classe "MediaPlayer", B. Minisini ha chiarito che esso necessita di un controllo che abbia una vera finestra X11 (o Wayland), altrimenti si userà il primo controllo genitore con una finestra reale, che di solito è quella di primo livello.