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()がハングすることがあります。によってインストールされたいくつかのエラーハンドラーが原因でsys.exit()、実際には終了しませんpygame.init()。IRC チャンネルの人々によると#pygame、この問題は決して修正されず、pygame は死んだプロジェクト (!?) であるとのことですが、メーリング リストやプロジェクトの Web サイトではまだ何らかの活動が行われているようです。多分これはpygame2で修正されるでしょう...

于 2013-04-07T21:13:58.723 に答える
0

sys.exit() と組み込み関数 exit() を試してください。

于 2013-04-02T16:44:04.743 に答える
0

pykaraoke を実行しようとしているときに、この問題に頻繁に遭遇しました。今夜だけ、それを pygame.mixer.music.play() までたどりました。奇妙なことに、これはマルチプロセッサ システムでのみ発生します。シングル プロセッサ システムでテストを行ったり、「maxcpus=1」で Linux を起動したりしても、問題は発生しません。そうしないと、定期的にハード ハングが発生し、SIGTERM が機能しないため、SIGKILL を使用する必要があります。

だから、それはpygameのバグか、それに依存していると思います。Python スクリプトと非常に短い (50k) MP3 ファイルを pygame-users メーリング リストに送信しました。何かあったらまた報告します。

更新: SDL_mixer と直接対話するプログラムでバグを再現できました。答えは、smpeg のバグです。libmad のサポートを有効にして SDL_mixer を再構築します。また、smpeg を完全にアンインストールする必要があります。これは、SDL_mixer が libmad を優先して使用しようとするためです。

于 2013-04-06T03:54:56.547 に答える