salve ragazzi, in un mio progetto che ho risolverato in questi giorni utilizzavo questa funzione per avere la durata di un filmato:
Public Function LenghtFromFile(percorso As String) As Integer
'Dim Lunghezza As Integer
Dim secondi As Integer
Dim Player As New MediaPlayer
Dim Tentativi As Integer
If Exist(percorso) = False Then
Message.Warning("File:" & gb.CrLf & percorso & gb.crlf & "do not exist! Check if it was renamed or moved.")
Return 9999
Endif
Player.url = Media.URL(percorso)
Player.Audio.Volume = 0
'Try Player.Play
Try Player.Pause
If Error Then
Wait 2
Player.url = Media.URL(percorso)
Try Player.Pause
Endif
Do
Wait
Loop Until Player.Duration > 0
Player.Pause
secondi = Player.Duration
'secondi = Hour(Lunghezza) * 3600 + Minute(Lunghezza) * 60 + Second(lunghezza)
Player.close
Return secondi
End
dopo i vari aggiornamenti di gambas di questi ultimi giorni pero' il loop andava all'infinito perche' se non mandavo in play il filamto gb.media non riusciva a detectare la lunghezza dello stream.
Per risolvere ho dovuto cambiare Try Player.Pause con Try Player.Play ... ma ora gstreamer mi apre (giustamente) una finestra per il play e poi la chiude a termine della funzione.
Sapete se e' possibile renderizzare una pipeline gstreamer su device null per evitare che apra e chiuda finestre ogni volta che si deve analizzare un filmato?
Ho provato a mettere
ma senza successo .....
utilizzavo questa funzione per avere la durata di un filmato:
Sapete se e' possibile renderizzare una pipeline gstreamer su device null per evitare che apra e chiuda finestre ogni volta che si deve analizzare un filmato?
Ho provato a mettere
ma senza successo .....
E' un algoritmo un po' complesso.... ci deve essere qualcos'altro per ottenere lo stesso risultato...
Ad ogni modo circa la tua domanda, vedi un po' se :-\ va bene adattando al tuo codice questo:
Private mp As New MediaPlayer As "mp"
Private uscitaVideo As MediaControl
Public Sub Form_Open()
' Istanzia il controllo di uscita video da usare. In questo caso sarà "ximagesink",
' un plug-in "videosink" basato sullo standard X:
With uscitaVideo = New MediaControl(mp, "ximagesink")
.SetWindow(Null)
End With
mp.URL = Media.URL("/percorso/del/file/video")
uscitaVideo.SetWindow(Null)
End
non mi sembra che funzioni ......
pensavo anche a sostituire uscitaVideo = New MediaControl(RiproduttoreVideo, "ximagesink") con fakesink ..
Public Sub InitPlayer()
'Istanzia il controllo di uscita video da usare. In questo caso sarà "ximagesink",
' un "videosink" basato sullo standard X, e che è esso stesso un plug-in:
uscitaVideo = New MediaControl(RiproduttoreVideo, "ximagesink") 'prova fakesink invece di ximagesink (con cui disegna una finestra)
uscitaVideo.SetWindow(Null) 'aggiunto per evitare che disegni a schermoi
'uscitaVideo.SetWindow(DrawingArea_Preview, 0, 0, DrawingArea_Preview.Width, DrawingArea_Preview.Height) 'non so perche' ma mi apre comunque una finestra
'Imposta il controllo di uscita video da usare:
RiproduttoreVideo.Video.Output = uscitaVideo
End
essendo fakesink uno dei pozzi di gstreamer ma nulla
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-fakesink.html
ma mi da' errore ....
qualcuno gia' c'aveva pensato ma non ho capito dove ha postato un po' di codice
Vedi questa soluzione:
Private mp As New MediaPlayer As "mp"
Private uscitaVideo As MediaControl
Public Sub Form_Open()
' Istanzia il controllo di uscita video da usare. In questo caso sarà "ximagesink",
' un plug-in "videosink" basato sullo standard X:
With uscitaVideo = New MediaControl(mp, "ximagesink")
.SetWindow(DrawingArea1)
End With
With mp
.Video.Output = uscitaVideo
.URL = Media.URL("/percorso/del/file/video")
End With
uscitaVideo.SetWindow(DrawingArea1)
With mp
.Audio.Mute = True
.Play()
Print mp.Duration
.Stop
End With
End
Sono del parere che il codice possa essere raffinato ancor di più.
Suggerirei questa soluzione; simile alla precedente, ma con alcuni cambiamenti:
Private mp As New MediaPlayer As "mp"
Private uscitaVideo As MediaControl
Public Sub Form_Open()
Dim DrawingArea1 As DrawingArea
' Creiamo formalmente un oggetto "DrawingArea", ma non lo definiamo geometricamente sul Form:
DrawingArea1 = New DrawingArea(Me)
With uscitaVideo = New MediaControl(mp, "ximagesink")
.SetWindow(DrawingArea1)
End With
With mp
.Video.Output = uscitaVideo
.URL = Media.URL("/percorso/del/file/video")
End With
With mp
' Invece di utilizzare la funzione "play()", impostiamo semplicemente proprietà dello stato del MediapLayer in "esecuzione":
.State = Media.Playing
' E' necessario attendere un po': mezzo secondo dovrebbe bastare:
Wait 0.5
Print CStr(Date(0, 0, 0, 0, 0, 0, mp.Duration * 1000))
' Invece di utilizzare la funzione "stop()", impostiamo semplicemente la proprietà dello stato del MediapLayer in "arresto":
.State = Media.Null
End With
End
pensavo anche a sostituire uscitaVideo = New MediaControl(RiproduttoreVideo, "ximagesink") con fakesink ..
essendo fakesink uno dei pozzi di gstreamer ma nulla
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-fakesink.html
ma mi da' errore ....
Sì, sono tornato su questa tua idea; e devo dire che a me funziona (ovviamente con qualche ritocco rispetto al tuo codice di prova):
Private mp As New MediaPlayer As "mp"
Private uscitaVideo As MediaControl
Public Sub Form_Open()
' Utilizziamo il plug-in "fakesink":
uscitaVideo = New MediaControl(mp, "fakesink")
With mp
.Video.Output = uscitaVideo
.URL = Media.URL("/percorso/del/file/video")
End With
With mp
' Invece di utilizzare la funzione "play()", impostiamo semplicemente proprietà dello stato del MediapLayer in "esecuzione":
.State = Media.Playing
' E' necessario attendere un po': mezzo secondo dovrebbe bastare:
Wait 0.5
Print CStr(Date(0, 0, 0, 0, 0, 0, mp.Duration * 1000))
' Invece di utilizzare la funzione "stop()", impostiamo semplicemente la proprietà dello stato del MediapLayer in "arresto":
.State = Media.Null
End With
End
ok! successo!
chissa' perche' prima non funzionava? boh ...
comunque introducendo il fakesink solo nella funzione che restituisce la durata in secondi di un file video il tutto si velocizza, mantenendo la riproduzione dei video su finestra nella preview inalterata e funzionante!
Public Function LenghtFromFile(percorso As String) As Integer
'Dim Lunghezza As Integer
Dim secondi As Integer
Dim Player As New MediaPlayer
Dim Tentativi As Integer
If Exist(percorso) = False Then
Message.Warning("File:" & gb.CrLf & percorso & gb.crlf & "do not exist! Check if it was renamed or moved.")
Return 9999
Endif
Player.url = Media.URL(percorso)
uscitaVideo = New MediaControl(Player, "fakesink")
Player.Video.Output = uscitaVideo
Player.Audio.Volume = 0
'Player.SetWindow(Null)
Try Player.Play
'Try Player.Pause
If Error Then
Wait 2
Player.url = Media.URL(percorso)
Try Player.Pause
Endif
Do
Wait
Loop Until Player.Duration > 0
Player.Pause
secondi = Player.Duration
'secondi = Hour(Lunghezza) * 3600 + Minute(Lunghezza) * 60 + Second(lunghezza)
Player.close
Return secondi
End
GRazie VUOTT!!
chissa' perche' prima non funzionava? boh ...
...perché imponevi la riga:
uscitaVideo.SetWindow(Null)
Riprendo il tuo ultimo codice e lo ripropongo come segue, eliminando l'uso del plugin "fakesink" di GStreamer, e usando al suo posto la Proprietà ".Video.Enable":
Public Sub Form_Open()
Dim s As String = "/percorso/del/file/video"
Dim f As Float
f = LenghtFromFile(s)
' Mostra il risultato nel titolo della finestra del Form:
Me.Title = "Durata video: " & Str(Time(0, 0, 0, f * 1000))
End
Private Function LenghtFromFile(percorso As String) As Float
Dim secondi As Float
Dim Player As New MediaPlayer
If Not Exist(percorso) Then
Message.Warning("File:\n" & percorso & "\ndo not exist! Check if it was renamed or moved.")
Return 9999
Endif
Player.URL = Media.URL(percorso)
Player.Video.Enabled = False
Player.Audio.Volume = 0
Player.Play
Repeat
secondi = Player.Duration
Wait 0.01
Until secondi > 0.0
Player.Stop
Player.close
Return secondi
End