2014-04-15 23 views
2

我在GTK#中使用LibVLC.NET包裝。我已經使用這個例子已經播放的視頻:GTK中的LibVLC.NET#

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()?

回答

1

根據平臺的不同,您需要調用libvlc_media_player_set_xwindow(Linux),libvlc_media_player_set_hwnd(Windows)或libvlc_media_player_set_nsobject(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; 
} 

你只需做一次得到所需要的窗口句柄,你不每次播放媒​​體時都需要這樣做。

+0

我認爲這會有所幫助,但是我在LibVLC.NET中沒有這個功能。 –

+0

如果是這樣,那麼我認爲你可以按照我描述的方式使用該庫。它看起來像該項目提供的示例通過使用位圖呈現視頻,這意味着它必須使用視頻回調。這沒有幫助:http://libvlcnet.codeplex.com/SourceControl/latest#trunk/LibVLC.NET.Presentation/? – caprica

+0

請參閱更新的問題。 –