質問: pygame.mixerでweb上でダウンロードした音楽ファイルを再生できません。 ``` import os import pygame pygame.init() sound =pygame.mixer.Sound("C:/Users/syosh/Desktop/pyworks/data/ball_collided.wav") sound =pygame.mixer.Sound("C:/Users/syosh/Desktop/pyworks/data/coin07.mp3") ``` `ball_collided.wav` も `coin07.mp3` も同じフォルダに保存しているのですが、以下のエラーメッセージが出ます。 **エラーメッセージ** ``` pygame.error: Unable to open file 'C:/Users/syosh/Desktop/pyworks/data/coin07.mp3 ``` ゲーム音のフリー素材リンク
回答: pygame.mixer.Soundの説明に書いてありました。 サポートしているファイルフォーマットの問題です。 以下の2つ以外は扱えないようです。 > > The Sound can be loaded from an OGG audio file or from an uncompressed WAV. > > > サウンドは、OGGオーディオファイルまたは非圧縮WAVからロードできます。 > > > @metropolis さんコメントのようにあらかじめ変換しておくか、あるいはフォーマットをサポートしている何か他のライブラリで読み込んでメモリ上で`.wav`に変換してから`pygame`に渡す等の対処が必要でしょう。 補足: 以下の記事によると、Pythonの音楽系で.mp3からフォーマット変換をサポートしているのは pydub + ffmpeg のみで、しかも変換だけではなくファイルへの書き出しが組み合わされるようで、メモリ上での変換だけという機能は無さそうです。 Playing and Recording Sound in Python Comparison of Audio Librariesの項を参照 soundfile + libsndfile の組み合わせも色々と出来るようですが、.mp3はサポートしていないと明記されています。 > > I have decided that I will not be adding support for MPEG Layer 3 (commonly known as MP3) due to the patent issues surrounding this file format. See the FAQ for more. > > > 一応以下のように pydub + ffmpeg と numpy を組み合わせて何とかするという手もあるようですが、面倒でしょうし。 【Python/pydub】mp3、wavのデータをNumPy配列に変換 NumpyのarrayからPydubのAudioSegmentを作成する ただ、追加でこんなのを見つけたので、使えるかもしれませんね。 miniaudio > > python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav) > > > miniaudioライブラリとそのデコーダー(mp3、flac、ogg vorbis、wav)のPythonバインディング。 > > >