GTK中的LibVLC.NET#

我在GTK#中使用LibVLC.NET包装器。 我已经使用这个例子播放了video:

LibVLCLibrary library = LibVLCLibrary.Load(null); IntPtr inst, mp, m; inst = library.libvlc_new(); // Load the VLC engine m = library.libvlc_media_new_location(inst, "path/to/your/file"); // Create a new item mp = library.libvlc_media_player_new_from_media(m); // Create a media player playing environement library.libvlc_media_release(m); // No need to keep the media now library.libvlc_media_player_play(mp); // play the media_player Thread.Sleep(10000); // Let it play a bit library.libvlc_media_player_stop(mp); // Stop playing library.libvlc_media_player_release(mp); // Free the media_player library.libvlc_release(inst); LibVLCLibrary.Free(library); 

但是在另一个新窗口中播放video,现在我需要在GTK#中设置窗口或(更好)容器来播放video。 我该怎么做?

更新:我在LibVLC.NET中找到了这个函数:

  //========================================================================== // void libvlc_video_set_format_callbacks (libvlc_media_player_t *mp, libvlc_video_format_cb setup, libvlc_video_cleanup_cb cleanup) //========================================================================== [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate uint libvlc_video_format_cb(ref IntPtr opaque, ref uint chroma, ref uint width, ref uint height, ref uint pitches, ref uint lines); //========================================================================== [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void libvlc_video_cleanup_cb(IntPtr opaque); //========================================================================== [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void libvlc_video_set_format_callbacks_signature(IntPtr mp, libvlc_video_format_cb setup, libvlc_video_cleanup_cb cleanup); //========================================================================== private readonly libvlc_video_set_format_callbacks_signature m_libvlc_video_set_format_callbacks; //========================================================================== public void libvlc_video_set_format_callbacks(IntPtr mp, libvlc_video_format_cb setup, libvlc_video_cleanup_cb cleanup) { VerifyAccess(); m_libvlc_video_set_format_callbacks(mp, setup, cleanup); } /* void libvlc_media_player_set_nsobject (libvlc_media_player_t *p_mi, void *drawable) void * libvlc_media_player_get_nsobject (libvlc_media_player_t *p_mi) void libvlc_media_player_set_agl (libvlc_media_player_t *p_mi, uint32_t drawable) uint32_t libvlc_media_player_get_agl (libvlc_media_player_t *p_mi) void libvlc_media_player_set_xwindow (libvlc_media_player_t *p_mi, uint32_t drawable) uint32_t libvlc_media_player_get_xwindow (libvlc_media_player_t *p_mi) void libvlc_media_player_set_hwnd (libvlc_media_player_t *p_mi, void *drawable) void * libvlc_media_player_get_hwnd (libvlc_media_player_t *p_mi) */ 

在评论中提到了libvlc_media_player_set_hwnd(),可能是这个函数以某种方式替换它或者提供与libvlc_media_player_set_hwnd()相同的机会?

根据平台,您需要调用libvlc_media_player_set_xwindow(Linux),libvlc_media_player_set_hwnd(Windows)或libvlc_media_player_set_nsobject(OSX)。

第二个参数是一个整数,它是要嵌入video的本机组件的句柄。

像GTK / GTK#这样的工具包应该在组件上提供一个方法,使您可以获得此窗口处理程序。

例如,这个C#代码可用于从GTK Widget获取所需的窗口句柄

 private static Int32 Wid(Widget widget) { IntPtr windowPtr = gtk_widget_get_window(widget.Handle); if(windowPtr != IntPtr.Zero) { IntPtr xidPtr = gdk_x11_drawable_get_xid(windowPtr); if(xidPtr != IntPtr.Zero) { return xidPtr.ToInt32(); } } return 0; } 

创建媒体播放器和本机组件后,您只需要执行此操作,每次播放媒​​体时都不需要这样做。