GTK 中的 LibVLC.NET# [英] LibVLC.NET in GTK#

查看:16
本文介绍了GTK 中的 LibVLC.NET#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 GTK# 中使用 LibVLC.NET 包装器.我已经使用这个例子播放了视频:

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);

但是视频在另一个新窗口中播放,现在我需要在 GTK# 中设置窗口或(更好的)容器来播放视频.我该怎么做?

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?

更新:我在 LibVLC.NET 中找到了这个函数:

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)
*/

在评论中提到了libvlc_media_player_set_hwnd(),可能是这个函数以某种方式取代了它或者提供了与libvlc_media_player_set_hwnd()相同的访问机会?

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

推荐答案

根据平台,需要调用 libvlc_media_player_set_xwindow (Linux)、libvlc_media_player_set_hwnd (Windows) 或 libvlc_media_player_set_nsobject (OSX).

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.

像 GTK/GTK# 这样的工具包应该在组件上提供一个方法,使您能够获得这个窗口处理程序.

Toolkits like GTK/GTK# should provide a method on the component that enables you to get this window handler.

例如,此 C# 代码可用于从 GTK 小部件获取所需的窗口句柄

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.

这篇关于GTK 中的 LibVLC.NET#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆