LibVLC.NET中的libvlc_media_player_set_hwnd()

时间:2014-04-16 09:41:51

标签: c# vlc gtk# libvlc

我需要在GTK#中使用libvlc_media_player_set_hwnd()函数,但我无法找到它。取而代之的是我在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()相同的机会?

所以我需要这个替换它的函数或函数,或者帮助我在所需窗口或gtk.widget中播放视频的方法(可能需要获取图像的位图或类似的东西)。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

libvlc / video / set_format_callbacks完全适用于与libvlc / media_player / set_hwnd不同的内容。虽然后者的使用相当明显(选择目标屏幕区域),但前者(根据this source)是libvlc_video_set_format的回调替代。好吧,我没有查看libvlc文档,但它可能很好地描述了。我不是libvlc的专家,但是,恕我直言,这两个功能相距甚远。

关于代码中注释中可见的其他函数:

  • libvlc_media_player_set_nsobject - 使用NSView(Cocoa)
  • libvlc_media_player_get_nsobject - 返回以前由前者设置的NSView(Cocoa)
  • libvlc_media_player_set_agl - 同样,但对于AGL(Apple OpenGL)
  • libvlc_media_player_get_agl - 同样,但对于AGL(Apple OpenGL)
  • libvlc_media_player_set_xwindow - 同样,但对于XWindows(genric Linux + XWin)
  • libvlc_media_player_get_xwindow - 同样,但对于XWindows(genric Linux + XWin)
  • libvlc_media_player_set_hwnd - 同样,但对于Microsoft Windows
  • libvlc_media_player_get_hwnd - 同样,但对于Microsoft Windows

(见the docs about them

因此,它取决于您尝试使用libVlc的什么平台,因为这决定了VLC在屏幕上绘制的方式。

如果你在MS Windows上进行任何建设 - 使用HWND对 如果您使用XWindows为Linux构建 - 使用XWindow对 如果你在MacOS / iOS上为Cocoa构建 - 使用NSObject / NSView对 如果您在MaxOS / iOS上构建OpenGL,请使用AGL对。

在MS Windows上,您必须使用HWND。即使你使用WPF / GTK#/等等。 MS Windows中的每个窗口都在其根目录中使用HWND。从您的UI库中挖掘出来。它在某处。但它可能不令人满意。例如,WPF(除非你做一些技巧)只为每个Window对象使用一个HWND句柄。将此HWND传递给VLC将导致VLC绘制所有其他窗口,而不仅仅是您想要的区域。这必须通过不同的方法解决,例如 - 创建另一个较小的窗口,将其保持在主窗口的顶部,并不断地同步其位置,使其移动,就好像它粘在主要窗口上一样。丑陋但简单,在大多数情况下都有效。