Differenze tra le versioni di "Gestione dei file video con le funzioni esterne delle API di GStreamer"

Da Gambas-it.org - Wikipedia.
Riga 54: Riga 54:
 
  ''void gst_video_overlay_set_window_handle(GstVideoOverlay *overlay, guintptr handle)''
 
  ''void gst_video_overlay_set_window_handle(GstVideoOverlay *overlay, guintptr handle)''
 
la quale, però è attualmente contenuta nella libreria ''libgstvideo-1.0''.
 
la quale, però è attualmente contenuta nella libreria ''libgstvideo-1.0''.
Il parametro ''overlay'' è un pointer che rappresenta l'<I>Elemento</i> sonoro, mentre il parametro ''handle'' è in intero che rappresenta il numero identificativo (''Id'') dell'oggetto, posto sul ''Form'', nel quale si intende mostrare il video. In Gambas, come già accennato, l'oggetto sarà una ''DrawingArea''.
+
Il parametro ''overlay'' è un pointer che rappresenta l'<I>Elemento</i> sonoro, mentre il parametro ''handle'' è in intero che rappresenta il numero identificativo (''Id'') dell'oggetto, posto sul ''Form'', nel quale si intende mostrare il video. In Gambas, come già accennato, l'oggetto potrà essere una ''DrawingArea''.
<BR>Detta funzione sarà in Gambas così dichiarata:
+
 
  Private Extern gst_video_overlay_set_window_handle(overlay As Pointer, id As Integer) In "libgstvideo-1.0"
+
 
e sarà richiamata in routine ad esempio così:
+
Mostriamo un semplice esempio:
gst_video_overlay_set_window_handle(elemSonoro, DrawingArea1.Handle)
+
  Library "libgstreamer-1.0"
Detta funzione andrà posta immediatamente dopo la funzione ''g_object_set()''. Facendo riferimento all'esempio precedente:
 
'''Private''' play As Pointer
 
 
   
 
   
 +
Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
 +
 +
<FONT Color=gray>' ''gst_init (int *argc, char **argv[])''
 +
' ''Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.''</font>
 +
Private Extern gst_init(argc As Pointer, argv As Pointer)
 +
 +
<FONT Color=gray>' ''GstElement * gst_element_factory_make(const gchar *factoryname, Const gchar * name)''
 +
' ''Create a new element of the type defined by the given element factory.''</font>
 +
Private Extern gst_element_factory_make(factoryname As String, name As String) As Pointer
 +
 +
<FONT Color=gray>' ''void g_object_set(gpointer object, const gchar *first_property_name, ...)''
 +
' ''Sets properties on an object.''</font>
 +
Private Extern g_object_set(gobject As Pointer, key As String, value As String, tertium As String)
 +
 +
<FONT Color=gray>' ''void gst_video_overlay_set_window_handle (GstVideoOverlay *overlay, guintptr handle)''
 +
' ''Calls the video overlay's set_window_handle method.''</font>
 +
Private Extern gst_video_overlay_set_window_handle(overlay As Pointer, id As Integer)
 +
 +
<FONT Color=gray>' ''GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)''
 +
' ''Sets the state of the element.''</font>
 +
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer
 +
 
 
   
 
   
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
   
 
   
   Dim retI As Integer
+
   Dim play As Pointer
 
   
 
   
 
   gst_init(0, 0)
 
   gst_init(0, 0)
Riga 71: Riga 91:
 
   play = gst_element_factory_make("playbin", "play")
 
   play = gst_element_factory_make("playbin", "play")
 
   
 
   
   g_object_set(play, "uri", "file:///''percorso/del/file/video''", Null)
+
   g_object_set(play, "uri", "file://<FONT Color=gray>''/percorso/del/file/video''</font>", Null)
 
   
 
   
 
   <FONT color=#B22222>gst_video_overlay_set_window_handle(play, DrawingArea1.Handle)</font>
 
   <FONT color=#B22222>gst_video_overlay_set_window_handle(play, DrawingArea1.Handle)</font>
 
   
 
   
 
  <FONT color=gray>' ''Avviamo la riproduzione audio:''</font>
 
  <FONT color=gray>' ''Avviamo la riproduzione audio:''</font>
   retI = gst_element_set_state(play, GST_STATE_PLAYING)
+
   gst_element_set_state(play, GST_STATE_PLAYING)
  Print "Stato di cambiamento = "; retI
+
   
 
 
 
  '''End'''
 
  '''End'''

Versione delle 19:58, 14 gen 2016

Le funzioni esterne dell'API di GStreamer consentono due modalità per riprodurre un file video:

  • all'interno di una finestra distinta dal Form principale;
  • all'interno di un oggetto capace di supportare il video e in generale le immagini, posto sul Form principale.

Facciamo riferimento, per i casi e gli esempi di codice che seguono, alla pagina della WIKI, nelle quali è stata descritta la gestione del sonoro in GStreamer. Lì si potrà avere contezza anche delle funzioni esterne necessarie di GStreamer dichiarate ed utilizzate.


Riproduzione del video all'interno di una finestra distinta da Form principale

Per ottenere la riproduzione di un file video all'interno di una finestra distinta da Form principale, e generata automaticamente da GStreamer, sarà sufficiente utilizzare la funzione esterna:

GstElement * gst_element_factory_make(const gchar *factoryname, const gchar *name)

alla quale si passerà il nome dell'Elemento, denominato "playbin" ed una denominazione per l'Elemento appena creato. È possibile passare NULL come argomento name per ottenere un unico nome predefinito.


Mostriamo di seguito un semplice esempio per riprodurre un file video all'interno di una finestra generata da GStreamer distinta dal Form di Gambas:

Library "libgstreamer-1.0"

Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING

' gst_init (int *argc, char **argv[])
' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.
Private Extern gst_init(argc As Pointer, argv As Pointer)

' GstElement * gst_element_factory_make(const gchar *factoryname, Const gchar * name)
' Create a new element of the type defined by the given element factory.
Private Extern gst_element_factory_make(factoryname As String, name As String) As Pointer

' void g_object_set(gpointer object, const gchar *first_property_name, ...)
' Sets properties on an object.
Private Extern g_object_set(gobject As Pointer, key As String, value As String, tertium As String)

' GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)
' Sets the state of the element.
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer


Public Sub Button1_Click()

 Dim play As Pointer
   
  gst_init(0, 0)

  play = gst_element_factory_make("playbin", "play")

  g_object_set(play, "uri", "file:///percorso/del/file/video", Null)

' Avviamo la riproduzione audio:
  gst_element_set_state(play, GST_STATE_PLAYING)
    
End


Mostrare il video sul Form

Per mostrare il video sul Form dell'applicazione Gambas principale (e dunque non, come nel caso precedente, in una finestra distinta) si dovrà porre sul Form un oggetto capace di supportare il video (ad esempio in Gambas una DrawingArea) e la seguente funzione esterna:

void gst_video_overlay_set_window_handle(GstVideoOverlay *overlay, guintptr handle)

la quale, però è attualmente contenuta nella libreria libgstvideo-1.0. Il parametro overlay è un pointer che rappresenta l'Elemento sonoro, mentre il parametro handle è in intero che rappresenta il numero identificativo (Id) dell'oggetto, posto sul Form, nel quale si intende mostrare il video. In Gambas, come già accennato, l'oggetto potrà essere una DrawingArea.


Mostriamo un semplice esempio:

Library "libgstreamer-1.0"

Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING

' gst_init (int *argc, char **argv[])
' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.
Private Extern gst_init(argc As Pointer, argv As Pointer)

' GstElement * gst_element_factory_make(const gchar *factoryname, Const gchar * name)
' Create a new element of the type defined by the given element factory.
Private Extern gst_element_factory_make(factoryname As String, name As String) As Pointer

' void g_object_set(gpointer object, const gchar *first_property_name, ...)
' Sets properties on an object.
Private Extern g_object_set(gobject As Pointer, key As String, value As String, tertium As String)

' void gst_video_overlay_set_window_handle (GstVideoOverlay *overlay, guintptr handle)
' Calls the video overlay's set_window_handle method.
Private Extern gst_video_overlay_set_window_handle(overlay As Pointer, id As Integer)

' GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)
' Sets the state of the element.
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer
 

Public Sub Button1_Click()

 Dim play As Pointer

  gst_init(0, 0)

  play = gst_element_factory_make("playbin", "play")

  g_object_set(play, "uri", "file:///percorso/del/file/video", Null)

  gst_video_overlay_set_window_handle(play, DrawingArea1.Handle)

' Avviamo la riproduzione audio:
  gst_element_set_state(play, GST_STATE_PLAYING)
    
End