1

我正在使用 StringIO 流式传输音乐数据,但是当我使用 pygame.mixer.music.load() 运行时,我的应用程序似乎不会退出。即使我使用 close():

def PlaySong(self, song_id):
    song = StringIO.StringIO(resp.read())
    self.pygame.mixer.music.load(song)
    ....

该函数将返回,但必须终止应用程序。如果我将响应保存到文件,然后加载文件名,它将关闭。有人可以帮忙吗?我不想使用本地存储。

更多信息。我在从文件打开和使用 stringio 时都做了一个 strace,strace 将为这两个实例正确退出。痕迹看起来很干净。

工作代码:

def playsong():
    mp3 = "/home/adam/Documents/pinyin/pinyinchart_win/pinyin/zuo2.mp3"
    #with open(mp3, "rb") as outfile:
    #    song = outfile.read()

    #io = StringIO.StringIO(song)
    pygame.init()
    pygame.mixer.music.load(mp3)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        pygame.time.Clock().tick(50)

    #io.close()
    #outfile.close()

不工作的代码:

def playsong():
    mp3 = "/home/adam/Documents/pinyin/pinyinchart_win/pinyin/zuo2.mp3"
    with open(mp3, "rb") as outfile:
        song = outfile.read()

    io = StringIO.StringIO(song)
    pygame.init()
    #pygame.mixer.music.load(io)
    pygame.mixer.music.load(mp3)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        pygame.time.Clock().tick(50)

    io.close()
    outfile.close()
4

4 回答 4

0

我有同样的问题 - 显然 pygame 在自行清理方面非常糟糕,pygame.quit()有时调用会挂起。Evensys.exit()实际上并没有退出,可能是因为pygame.init(). 据#pygameIRC 频道上的人说,这个问题永远不会得到解决,而且 pygame 是一个死项目(!?),尽管邮件列表和项目网站上似乎仍有一些活动。也许这将在pygame2中修复......

于 2013-04-07T21:13:58.723 回答
0

当使用 Python 的线程支持时,我已经看到了这种行为。pygame 可能正在使用线程,并且其中一些线程是隐式生成的,没有标记为“守护进程”线程,并且在您尝试.quit()时没有加入。

请注意,sys.exit()不太可能工作,因为这会引发 SystemExit 异常(可能会被捕获,特别是可能被atexit处理程序捕获)。此外sys.exit()只会退出处理它的线程,其他线程仍将运行。(StackOverflow:pygame 中 sys.exit() 的问题,以获取更多详细信息)。

这是另一个:StackOverflow: pygame screen freezes when I close it

我在 Google 上尝试了一些关于以下短语的搜索:pygame quit {fails, hangs,stalls} ...其中大多数导致了与我在此处提供的类似的讨论。

共识似乎是您希望构建线程以处理“退出”事件,以便在您的主(父)进程尝试使用sys.exit()或干脆退出之前,所有线程都调用pygame.quit() _ _套房_main_

除此之外,我还会检查是否某些进程、线程或驱动程序在您的音乐设备上停滞不前。ps在进程列表(命令输出)中显示为“D”状态的类 Unix 系统中。(我假设您提到strace是在 Linux 上运行的)。

于 2013-04-07T21:37:45.357 回答
0

我在尝试运行 pykaraoke 时经常遇到这个问题;直到今晚,我才将其追溯到 pygame.mixer.music.play()。奇怪的是,它只发生在多处理器系统上;如果我在单处理器系统上进行测试,或者使用“maxcpus=1”启动 Linux,则不会发生。否则,硬挂起会经常发生,我必须使用 SIGKILL,因为 SIGTERM 不起作用。

所以我认为这是pygame中的一个错误,或者它依赖的东西。我刚刚向 pygame-users 邮件列表发送了一个 Python 脚本和非常短(50k)的 MP3 文件;如果有什么事,我会回来报告的。

更新:我能够使用与 SDL_mixer 直接交互的程序重现该错误。答案是,这是 smpeg 中的一个错误。重建 SDL_mixer 并启用对 libmad 的支持。您还必须完全卸载 smpeg,因为 SDL_mixer 会尝试使用它来支持 libmad。

于 2013-04-06T03:54:56.547 回答
0

试试 sys.exit() 和内置函数 exit()。

于 2013-04-02T16:44:04.743 回答