C# GTK中的LibVLC.NET#
我在GTK中使用包装器。我已经用这个例子播放了视频:C# GTK中的LibVLC.NET#,c#,vlc,gtk#,libvlc,C#,Vlc,Gtk#,Libvlc,我在GTK中使用包装器。我已经用这个例子播放了视频: 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
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);
但是在另一个新窗口中播放视频,现在我需要在GTK中设置窗口或(更好的)容器来播放视频。我该怎么做
更新:
我在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_nsu object(OSX) 第二个参数是一个整数,它是要嵌入视频的本机组件的句柄 GTK/GTK#之类的工具包应该在组件上提供一种方法,使您能够获取此窗口处理程序 例如,此C#代码可用于从GTK小部件获取所需的窗口句柄
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;
}
在创建媒体播放器和本机组件后,只需执行一次,而不必每次播放媒体时都执行。我认为这会有所帮助,但LibVLC.NET中没有此功能。如果是这样,那么我认为您无法按照我描述的方式使用该库。该项目提供的示例使用位图渲染视频,这意味着它必须使用视频回调。这没有帮助:?如何在GTK#中使用私有静态Int32 Wid(小部件小部件)?或者如何在GTK中获得xid?