Autore Topic: Gambas Media disegnare su finestra nulla  (Letto 1317 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Gambas Media disegnare su finestra nulla
« il: 10 Agosto 2015, 13:33:20 »
salve ragazzi, in un mio progetto che ho risolverato in questi giorni utilizzavo questa funzione per avere la durata di un filmato:

Codice: [Seleziona]
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
Codice: [Seleziona]
player.SetWindow(null)

ma senza successo .....
 
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.298
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Gambas Media disegnare su finestra nulla
« Risposta #1 il: 10 Agosto 2015, 16:05:16 »
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
Codice: [Seleziona]
player.SetWindow(null)

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:
Codice: gambas [Seleziona]
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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: Gambas Media disegnare su finestra nulla
« Risposta #2 il: 10 Agosto 2015, 17:44:33 »
non mi sembra che funzioni ......

pensavo anche a sostituire uscitaVideo = New MediaControl(RiproduttoreVideo, "ximagesink") con fakesink ..

Codice: [Seleziona]
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
« Ultima modifica: 10 Agosto 2015, 17:51:51 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.298
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Gambas Media disegnare su finestra nulla
« Risposta #3 il: 10 Agosto 2015, 18:14:48 »
Vedi questa soluzione:

Codice: gambas [Seleziona]
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
« Ultima modifica: 11 Agosto 2015, 23:03:18 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: Gambas Media disegnare su finestra nulla
« Risposta #4 il: 11 Agosto 2015, 18:30:19 »
ok, anche con il tuo suggeriemnto ho risolto un bug che avevo da tempo nell'applicazione.

Gambas media mi apriva una finestra esterna per il play del filmato anche se avevo impostato la riproduzione du una drawing area di "preview".

Ora sflasha ancora quando non dovrebbe disegnare nulla .... ma sembra un po' piu' veloce e finalmente la preview dei video la fa' nella drawing area dedicata.
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.298
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Gambas Media disegnare su finestra nulla
« Risposta #5 il: 11 Agosto 2015, 23:26:40 »
Sono del parere che il codice possa essere raffinato ancor di più.
Suggerirei questa soluzione; simile alla precedente, ma con alcuni cambiamenti:

Codice: gambas [Seleziona]
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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.298
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Gambas Media disegnare su finestra nulla
« Risposta #6 il: 11 Agosto 2015, 23:41:58 »
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):

Codice: gambas [Seleziona]
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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: Gambas Media disegnare su finestra nulla
« Risposta #7 il: 14 Agosto 2015, 14:03:52 »
assolutamente ci devo riuscire!

se funziona a te deve funzionare anche a me :D
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: Gambas Media disegnare su finestra nulla
« Risposta #8 il: 14 Agosto 2015, 18:31:06 »
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!

Codice: [Seleziona]
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!!
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.298
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Gambas Media disegnare su finestra nulla
« Risposta #9 il: 14 Agosto 2015, 18:44:32 »
chissa' perche' prima non funzionava? boh ...

...perché imponevi la riga:
Codice: gambas [Seleziona]
uscitaVideo.SetWindow(Null)
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: Gambas Media disegnare su finestra nulla
« Risposta #10 il: 17 Agosto 2015, 13:58:26 »
puo' essere, ma mi sembra che dava errore anche solo mettendo fakesink al posto di xwindowssink ....

pero' va bene cosi' :D
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.298
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gambas Media disegnare su finestra nulla
« Risposta #11 il: 30 Settembre 2022, 20:53:05 »
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":

Codice: [Seleziona]
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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »