libvlc和gtk(用于GUI)don';我们不能一起工作吗?

libvlc和gtk(用于GUI)don';我们不能一起工作吗?,gtk,libvlc,Gtk,Libvlc,我试图同时使用libvlc和gtk+,但没有成功。我认为我用于GUI的libvlc\u media\u player\u set\u xwindow()函数有问题。我的代码如下: #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <string.h> #include <time.h> #include <inttypes.h> #in

我试图同时使用libvlc和gtk+,但没有成功。我认为我用于GUI的
libvlc\u media\u player\u set\u xwindow()
函数有问题。我的代码如下:

#include <stdio.h>  
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <time.h>
#include <inttypes.h>
#include <vlc/vlc.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>

libvlc_media_t *media_played;
libvlc_media_player_t *is_play;
void Play(gpointer frame, GtkButton * button);
int main(int argc, char **argv)
{
  libvlc_instance_t * instance = libvlc_new(0,NULL);
  libvlc_media_player_t *player = libvlc_media_player_new(instance);
  is_play = player;
  gtk_init(&argc, &argv);
  char Files[256];
  int i =0;
  printf("enter file name plus path, replace scape by '=' character\n");
  scanf("%s", Files);
  for(i = 0; i < 256; i++)
  {
      if(Files[i] == '=') Files[i] = ' ';
  }
  libvlc_media_t *media = libvlc_media_new_path(instance, Files);
  media_played = media;
  libvlc_media_player_set_media(player, media);
  GtkWidget * window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  GtkWidget * table = gtk_table_new(1,2,FALSE);
  GtkWidget * table1 = gtk_table_new(1,1,TRUE);
  GtkWidget *frame = gtk_frame_new(NULL);
  gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
  GtkWidget *button = gtk_button_new_with_mnemonic("_Play");
  g_signal_connect_swapped(GTK_BUTTON(button),"clicked",G_CALLBACK(Play),(gpointer)frame);  
  libvlc_media_player_set_xwindow(player, GDK_WINDOW_XID(frame->window));
  gtk_table_attach(GTK_TABLE(table1),button,0,1,0,1,GTK_FILL,GTK_FILL,0,0);
  gtk_table_attach(GTK_TABLE(table),table1,0,1,0,1,GTK_FILL,GTK_FILL,0,0);
  gtk_table_attach(GTK_TABLE(table),frame,1,2,0,1,GTK_FILL,GTK_FILL,0,0);
  gtk_container_add(GTK_CONTAINER(window),table);
  gtk_widget_show_all(window);
  gtk_main();
  return 0;
}

void Play(gpointer frame, GtkButton * button)
{
   char * title = libvlc_media_get_meta(media_played, libvlc_meta_Title);
   printf("vlc will play: %s\n", title);
   int64_t Time = libvlc_media_get_duration(media_played);
   libvlc_media_player_play(is_play);
   Time = Time/1000;
   clock_t c = clock();
   clock_t t = c;
   while((c/CLOCKS_PER_SEC)<( Time + t))
   {
        c = c + clock();
   }
   gtk_widget_destroy(((GTK_WIDGET(frame)->parent)->parent));
   gtk_main_quit();
}  

有人有办法吗

问题最有可能是因为当您在代码中调用
libvlc\u media\u player\u set\u xwindow
时,
frame
(或者更准确地说是顶层窗口)尚未实现,并且与之关联的
GdkWindow
也就是说,
frame->window
尚未创建。将呼叫
libvlc\u media\u player\u set\u xwindow
移动到
gtk\u widget\u show\u all(window)之后输入代码并检查您的应用程序。
使用
GtkWidget
指针来获取相关的
GdkWindow
可能是一个好主意,即使用
gtk\u小部件获取窗口(框架)
而不是
frame->window


希望这有帮助

问题最有可能是因为当您在代码中调用
libvlc\u media\u player\u set\u xwindow
时,
frame
(或者更准确地说是顶层窗口)尚未实现,并且与之关联的
GdkWindow
也就是说,
frame->window
尚未创建。将呼叫
libvlc\u media\u player\u set\u xwindow
移动到
gtk\u widget\u show\u all(window)之后输入代码并检查您的应用程序。
使用
GtkWidget
指针来获取相关的
GdkWindow
可能是一个好主意,即使用
gtk\u小部件获取窗口(框架)
而不是
frame->window


希望这有帮助

我想在我的gtk GUI界面中嵌入vlc,但效果很好。我想在我的gtk GUI界面中嵌入vlc,但效果很好。我已经尝试过,在gtk_widget_show()工作后调用libvlc_media_player_set_xwindow,但即使使用gtk_widget_get_window(),libvlc也会占用所有提供的空间。似乎不可能在GtkFrame小部件上绘制,因为它与GtkdrawingArea一起运行得非常完美。电影拍摄的正是空间的GtkdrawingArea。@NarcisseDoudieuSiewe:我并没有真正使用
libvlc
,但看起来您提供了完整的视频渲染窗口。当您提供窗口的xid时,视频将在窗口上渲染。嗯,你到底在找什么?限制视频渲染的区域?@NarcisseDoudieuSiewe:没错。框架没有自己的窗口,即它没有与之关联的X11窗口,而是使用顶层窗口的窗口。但对于绘图区域,有一个单独的x11窗口与其关联,它与顶层窗口不同。这就是为什么要使用观察行为我有一个问题,您说:“看起来您提供了完整的视频渲染窗口”,但GtkWidget结构有一个GdkWindow成员调用“窗口”,它是一个GdkDrawable对象,我知道我们可以在它上面绘制,在它上面设置许多像素等等。。。这就是我使用frame->window的原因,但您已经说过gtkframe小部件没有关联的X11窗口,它使用顶级窗口的X11窗口,所以我知道frame->window和window->window指向同一个gdkwindow。当我在gtk+手册参考上简要查看gtk+站点时,没有什么可以告诉我的此小部件或此小部件没有X11窗口。你能给我一个教程,给我所有这些细节吗??这对创造好东西至关重要。非常感谢您的帮助,现在我已经知道了很多天以来的问题。我已经尝试过了,在gtk_widget_show()工作后调用libvlc_media_player_set_xwindow(),但即使使用gtk_widget_get_window(),libvlc也占用了所有提供的空间。似乎不可能在GtkFrame小部件上绘制,因为它与GtkdrawingArea一起运行得非常完美。电影拍摄的正是空间的GtkdrawingArea。@NarcisseDoudieuSiewe:我并没有真正使用
libvlc
,但看起来您提供了完整的视频渲染窗口。当您提供窗口的xid时,视频将在窗口上渲染。嗯,你到底在找什么?限制视频渲染的区域?@NarcisseDoudieuSiewe:没错。框架没有自己的窗口,即它没有与之关联的X11窗口,而是使用顶层窗口的窗口。但对于绘图区域,有一个单独的x11窗口与其关联,它与顶层窗口不同。这就是为什么要使用观察行为我有一个问题,您说:“看起来您提供了完整的视频渲染窗口”,但GtkWidget结构有一个GdkWindow成员调用“窗口”,它是一个GdkDrawable对象,我知道我们可以在它上面绘制,在它上面设置许多像素等等。。。这就是我使用frame->window的原因,但您已经说过gtkframe小部件没有关联的X11窗口,它使用顶级窗口的X11窗口,所以我知道frame->window和window->window指向同一个gdkwindow。当我在gtk+手册参考上简要查看gtk+站点时,没有什么可以告诉我的此小部件或此小部件没有X11窗口。你能给我一个教程,给我所有这些细节吗??这对创造好东西至关重要。非常感谢你的帮助,从很多天以来我就知道了问题的确切原因。
(vlc1:7774): Gdk-WARNING **: /build/buildd/gtk+2.0-2.24.10/gdk/x11/gdkdrawable-x11.c:952 drawable is not a pixmap or window