问题
I use LibVLC.NET wrapper in GTK#. And I have already played video using this example:
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);
But video playing in another new window, now i need to set window or (better) container in GTK# which will play video. How should I do this?
Update: I found this function in 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)
*/
In the comments there is mention of libvlc_media_player_set_hwnd (), may be this function somehow replace it or give access to the same opportunities as libvlc_media_player_set_hwnd ()?
回答1:
Depending on the platform, you need to call libvlc_media_player_set_xwindow (Linux), libvlc_media_player_set_hwnd (Windows), or libvlc_media_player_set_nsobject (OSX).
The second parameter is an integer that is the handle to the native component that you want to embed the video.
Toolkits like GTK/GTK# should provide a method on the component that enables you to get this window handler.
For example this C# code can be used to get the needed window handle from a 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;
}
You only need to do this once after you create your media player and the native component, you do not need to do it each time you play media.
来源:https://stackoverflow.com/questions/23072724/libvlc-net-in-gtk