QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1766|回复: 8

请教基于gtk的视频播放客户端的开发?

[复制链接]
发表于 2005-7-19 22:15:58 | 显示全部楼层 |阅读模式
也就是基于gtk写一个视频播放器的界面.

但是小弟现在碰到的问题是如何定位播放器的窗口,也就是让视频图像在指定位置显示出来.gtk里面好像没有专门针对视频的widget.

现在是基于mpeg4ip中player修改的,但是它选定播放文件是在一个貌似随机的地方打开一个新的播放窗口.

请教高手应该怎么样定位,在指定的地方播放视频流.

谢谢.
 楼主| 发表于 2005-7-19 22:51:32 | 显示全部楼层
忘了说了,视频窗口是基于sdl绘制的
回复

使用道具 举报

发表于 2005-7-20 07:08:21 | 显示全部楼层
我记的sdl的窗口可以放在GTK里的。。。sdl的网站里有example
回复

使用道具 举报

发表于 2005-7-20 09:37:39 | 显示全部楼层
有一个mplayer的WIDGET,不过不是太好用,不能最大化,我现在也一直在找这种东西,但好像LINUX下很难能和WINDOWS下一样用搞!
楼主不如用XINE做一个像KAFINNE的玩意?
回复

使用道具 举报

发表于 2005-7-20 10:28:26 | 显示全部楼层
sdl说实话,我觉得很慢
回复

使用道具 举报

发表于 2005-7-20 12:49:07 | 显示全部楼层
用Xv或者XvMC接口,XvMC速度最快,不过要显卡和驱动支持XvMC,Xv一般的显卡和驱动都支持。
回复

使用道具 举报

 楼主| 发表于 2005-7-20 14:18:33 | 显示全部楼层
因为项目本身的要求,现在开发环境和工具已经确定下来,不能改变.

按照applepie兄的提示,我到s d l 主页找了一个de mo ,仿照写了一段测试代码,编译通过.

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#include <gdk/gdkx.h>

#ifdef USE_XSHAPE
#include <X11/Xlib.h>
#include <X11/extensions/shape.h>
#endif

#include "SDL.h"

#define WINSIZEX 320
#define WINSIZEY 200

#include <gtk/gtk.h>

int main( int   argc,
          char *argv[] )
{
  /* GtkWidget is the storage type for widgets */
  GtkWidget *window;
  GtkWidget *frame;
  SDL_Surface *screen = NULL;

  /* Initialise GTK */
  gtk_init (&argc, &argv);
   
  /* Create a new window */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Frame Example");

  /* Here we connect the "destroy" event to a signal handler */
  g_signal_connect (G_OBJECT (window), "destroy",
                    G_CALLBACK (gtk_main_quit), NULL);

  gtk_widget_set_size_request (window, 300, 300);
  /* Sets the border width of the window. */
  gtk_container_set_border_width (GTK_CONTAINER (window), 10);

  /* Create a Frame */
  frame = gtk_frame_new ("hi");
  gtk_container_add (GTK_CONTAINER (window), frame);

  /* Set the frame's label */
  //gtk_frame_set_label (GTK_FRAME (frame), "GTK Frame Widget");

  /* Align the label at the right of the frame */
  //gtk_frame_set_label_align (GTK_FRAME (frame), 1.0, 0.0);

  /* Set the style of the frame */
  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT);

  { char SDL_windowhack[32];
                sprintf(SDL_windowhack,"SDL_WINDOWID=%ld",
                        GDK_WINDOW_XWINDOW(window->window));
                putenv(SDL_windowhack);
        }

        /* Initialize SDL */
        if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
                fprintf(stderr,"Couldn't initialize SDL: %s\n",SDL_GetError());
                gtk_main_quit();
        }

        screen = SDL_SetVideoMode(100, 100, 0, 0);
  
  gtk_widget_show (frame);

  /* Display the window */
  gtk_widget_show (window);
   
  /* Enter the event loop */
  gtk_main ();
  SDL_Quit();
   
  return 0;
}

但是注册环境变量  { char SDL_windowhack[32];
                sprintf(SDL_windowhack,"SDL_WINDOWID=%ld",
                        GDK_WINDOW_XWINDOW(window->window));
                putenv(SDL_windowhack);
        }这段似乎有问题,运行的时候提示:

(frame:3373): Gdk-WARNING **: gdkdrawable-x11.c:912 drawable is not apixmap or window
The program 'frame' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadWindow (invalid Window parameter)'.
  (Details: serial 42 error_code 3 request_code 3 minor_code 0)
  (Note to programmers: normally, X errors are reported asynchronously;
   that is, you will receive the error a while after causing it.
   To debug your program, run it with the --sync command line
   option to change this behavior. You can then get a meaningful
   backtrace from your debugger if you break on the gdk_x_error() function.)

是s d l 还是g t k 运行的时候自动调用SDL_windowhack这个参数?我g t k 的版本是2.4.13的,和g t k 1.2是不兼容的.s d l 的版本是1.2.7的.

如果把注册环境这段去除,程序是对的,就是在一个随机的地方弹出播放窗口.
回复

使用道具 举报

 楼主| 发表于 2005-7-21 21:07:28 | 显示全部楼层
我从sdl主页上down了一个demo下来,根据以下这段话可以将sdl视频窗口插入:
{ char SDL_windowhack[32];
                sprintf(SDL_windowhack,"SDL_WINDOWID=%ld",
                        GDK_WINDOW_XWINDOW(mainwin->window));
                putenv(SDL_windowhack);
        }

        /* Initialize SDL */
        if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
                fprintf(stderr,"Couldn't initialize SDL: %s\n",SDL_GetError());
                gtk_main_quit();
        }

        screen = SDL_SetVideoMode(WINSIZEX, WINSIZEY, 0, 0);

但是,这里有一个定位的问题。以上代码的GDK_WINDOW_XWINDOW(mainwin->window)中的widget是一个window,而且要求是top_level的窗口,这样就不能让视频窗口在指定位置显示。
查了一下资料,frame等widget是没有->window的,而尝试过button等没有明确说没有->window的也不行。然后发现drawingarea这个widget说明里有->window,但实现却还是报xwindow error的错误。
就我现在接触的两个基于gtk的播放器,mpeg4ip的player和mplayer,都是一个控制窗口,选定视频文件后弹出视频窗口。是不是gtk本身的问题,所以想通过其他widget控件定位窗口就是一个不可完成的问题。

如果可以的话,请问用哪个窗口呢?
回复

使用道具 举报

发表于 2005-7-22 14:53:27 | 显示全部楼层
不太懂。
我的观点:控制窗口和播放窗口应该是两个进程,通过进程间通信来控制播放。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 17:19 , Processed in 0.081280 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表