libvlc_media_player_set_hwnd() in LibVLC.NET

本文关键字:in NET LibVLC hwnd media player set libvlc | 更新日期: 2023-09-27 17:58:38

我需要在GTK#中使用libvlc_media_player_set_ownd()函数,但我找不到。相反,我在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_hhwnd(),这个函数是否以某种方式取代了它,或者提供了与libvlc_media_player_set-hhwnd相同的机会?

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

我能做什么?

libvlc_media_player_set_hwnd() in LibVLC.NET

libvlc/video/set_format_callbackslibvlc/media_player/set_hwnd完全不同。虽然后者的使用相当明显(选择目标屏幕区域),但前者(根据该来源)是libvlc_video_set_format的回调替代品。嗯,我没有查看libvlc文档,但那里可能描述得很好。我不是libvlc方面的专家,但是,IMHO,这两个函数相距甚远。

关于代码注释中可见的其他功能:

  • 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_ownd—同样,但适用于Microsoft Windows
  • libvlc_media_player_get_hwnd—同样,但适用于Microsoft Windows

(参见相关文档)

因此,这取决于您尝试使用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绘制所有其他窗口,而不仅仅是您想要的区域。这必须通过不同的方式来解决,例如,创建另一个较小的窗口,将其保持在主窗口的顶部,并不断同步其位置,使其移动,就像粘在主窗口上一样。丑陋,但简单,在大多数情况下有效。