【问题标题】:Resizing a video player调整视频播放器的大小
【发布时间】:2012-08-16 12:48:49
【问题描述】:

我有基于 pygame 的视频播放器,它有用于 GUI 的 berkelium 浏览器, 下面是用于播放流的 VLC 库。我没有制作播放器,但我会 喜欢添加一个“调整大小”选项,目前不存在。 该应用程序是为 OS X 制作的。

播放器初始化时,调用pygame.set_mode(screensize,OPENGL|DOUBLEBUF|RESIZABLE),问题是当我调整窗口大小超过屏幕大小时,这些部分不可见(显示错误),如果我再次尝试pygame.set_mode,它会导致应用程序由于依赖项(浏览器和 VLC)而崩溃。

所以我决定使用以下方法初始化屏幕:

pygame.set_mode(screenresolution, OPENGL|DOUBLEBUF|RESIZABLE)

应该将其设置为最大值,然后切换回原始的较小分辨率(如使用鼠标调整大小)。

如何做到这一点?如何模拟RESIZABLE标志和鼠标移动动作?

播放器可以很好地调整到更小的尺寸,只有更大的尺寸才是问题。

class InputAndDisplay:
    def init(self, fullscreen=False):
        global pygame, sys
        # if 'darwin' in sys.platform:
        #     import sys
        #     sys.argv = ['Core.py']
        #     import pygame.macosx
        #     pygame.macosx.init()

        pygame.init()

        global screenSize
        self.screenSize = screenSize
        if fullscreen:
            try: self.screenSize = pygame.display.list_modes()[0]
            except Exception, e: print e
            flags = OPENGL|DOUBLEBUF|FULLSCREEN
        else:
            flags = RESIZABLE|OPENGL|DOUBLEBUF

        print 'screenSize:', self.screenSize

        try:
            povrsina = pygame.display.set_mode(self.screenSize, flags)
        except Exception, e:
            print e
            self.screenSize = screenSize
            povrsina = pygame.display.set_mode(self.screenSize, RESIZABLE|OPENGL|DOUBLEBUF)
        pygame.display.set_caption('NetTVBox-WebPlayer')

        pygame.mouse.set_pos(list(self.screenSize))
        if 'darwin' not in sys.platform:
            pygame.mouse.set_visible(False)

        #pygame.key.set_repeat(300, 100)

        if 'darwin' not in sys.platform:
            pygame.mixer.quit()

        if 'linux' in sys.platform: # try to turn off vsyncing
            import ctypes
            libgl = ctypes.cdll.LoadLibrary('libGL.so.1')
            proc = libgl.glXGetProcAddressARB('glXSwapIntervalMESA')
            _glXSwapIntervalMESA = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int)(proc)
            _glXSwapIntervalMESA(0)

        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        #gluPerspective(45.0, 640/480.0, 0.1, 100.0)
        glOrtho(-0.5, 0.5, -0.5, 0.5, -5, 5)
        #glTranslatef(0.0, 0.0, -3.0)
        #glRotatef(25, 1, 0, 0)

        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()

        glEnable(GL_TEXTURE_2D)
        glShadeModel(GL_FLAT)
        glClearColor(0.0, 0.0, 0.0, 0.0)
        glClearDepth(1.0)
        glEnable(GL_DEPTH_TEST)
        glDepthFunc(GL_LEQUAL)
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)

        self.textures = glGenTextures(2)

        self.threeDmode = MODE_3D_OFF

这是initinputAndDisplay.py
主文件是Core.py,它调用了它,还有很多其他的东西。这就是为什么我没有把所有代码都放在这里的原因,它有很多,但并不重要
这是Core.py的一部分:

input_and_display = InputAndDisplay()
input_and_display.init(self.fullscreen)
rc = RemoteControl()
rc.init()
media = Media()
if 1: # !
    media.config = {
        'buffering': state.mediaplayer_buffering,
        'contrast': state.mediaplayer_contrast,
        'saturation': state.mediaplayer_saturation,
    }
media.init()
browser = Browser()
browser.init()

提前感谢您的帮助

【问题讨论】:

  • 分享更多代码。最好是初始化部分。

标签: pygame vlc resizable


【解决方案1】:

听起来您缺少检测大小调整的 VIDEORESIZE 事件。

(查看相关事件:VIDEOEXPOSEACTIVEEVENThttp://www.pygame.org/docs/ref/event.html

http://www.pygame.org/docs/ref/display.html#pygame.display.set_mode

" 然后设置显示模式,在pygame事件队列中放置几个​​事件。当用户请求程序关闭时发送pygame.QUIT。窗口会收到 pygame.ACTIVEEVENT 事件作为显示器获得和失去输入焦点。如果显示器设置了 pygame.RESIZABLE 标志,pygame.VIDEORESIZE 事件将在用户调整窗口尺寸时发送. 当窗口的某些部分必须重新绘制时,直接绘制到屏幕上的硬件显示器将获得 pygame.VIDEOEXPOSE 事件。"

【讨论】:

  • 经过几个小时的谷歌搜索后,我发现它有点不可能:) * 在线更正我说应用程序在新设置模式下崩溃,它不会崩溃,声音和视频保持在旧上下文中,新屏幕是black,我读了一些opengl contextes,这就是我的结局,opengl contexts and stuf此时对我来说是一个很大的问题,无论如何感谢您的帮助,至于Videoresize事件我没有错过它只是没有放它。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2017-03-24
  • 2015-01-05
  • 1970-01-01
相关资源
最近更新 更多