はじめに
Pythonを使ったオーディオプレイヤ―の実装過程を順次投稿しています。
前回までの進捗は以下の通りです。
今回実装した内容
- GUI
- 特になし
- 機能
- MP3ファイルの入力と再生
- MP3ファイルからカバーアートなどのメタ情報を取得し、表示
ソースコード
環境
Windows11
Python3.12.7
動作イメージ
音楽 BGMer
ソースコードの補足
MP3ファイルの取り扱い
def _open_mp3(self, input_path:str):
try:
mp3_data = AudioSegment.from_mp3(input_path)
framerate = mp3_data.frame_rate
nchannels = mp3_data.channels
samplewidth = mp3_data.sample_width
frames = bytes(mp3_data.get_array_of_samples())
except FileNotFoundError:
print(f"Error: cannot find {input_path}")
return None
print(f"{input_path} has been loaded")
print(f'{nchannels}ch {samplewidth * 8}bit {framerate}Hz')
try:
tags = ID3(input_path)
print(tags.pprint())
attached_picture_data = tags.get("APIC:").data
cover_art = PIL.Image.open(BytesIO(attached_picture_data))
artist = tags.get('TPE1')
album = tags.get('TALB')
title = tags.get('TIT2')
return Audio(nchannels, samplewidth, framerate, frames), AudioTag(cover_art, album, artist, title)
except:
print("Error: cannot get any tags")
return Audio(nchannels, samplewidth, framerate, frames), AudioTag(title=os.path.basename(input_path))
MP3ファイルのデコード処理には、pydubを使用しました。pydubはffmpegを利用したオーディオライブラリで、様々なフォーマットのオーディオファイルを取り扱うことができます。なお、PyAuidioで再生することを想定しているため、データ自体はbytes形式で保存してます。何らかな信号処理を行う場合は、numpy形式で取り扱うことになるのですが。
メタ情報の習得には、mutagenを使用しました。mutagenはオーディオファイルのメタ情報に特化したライブラリで、それぞれのフォーマットに対応したメタ情報の読み書きができます。MP3には、ID3タグというMP3ファイルの中にメタ情報を書き込むための規格があり、アーティスト、曲名、カバーアートや歌詞といった様々な情報を格納することができます。mutagen.ID3を使えばID3タグを簡単に取得することができます。なお、ほしいメタ情報に応じたIDが必要になります。カバーアートならAPIC、タイトルならTIT2です。mutagen.EasyID3ならもっと簡単に取得可能ですが、カバーアートや歌詞は読み書きすることができないので注意が必要です。
備考
- オーディオファイルはWAVとMP3だけに対応
- 他のフォーマットは次回以降に対応
- threadingあるいはmultiprocessingを使用していないため、あいかわらずオーディオを再生中にイベントループの処理が止まる。つまり、ポーズボタンを押しても停止させることができず、再生ボタン以外は意味をなしていない。強制終了以外に、アプリを終了すことすらできない
- 次回以降に対応
おわりに
次回に続きます。
Qiitaの作法やソースコードに関するアドバイス、質問などがありましたらコメント欄までお願いします。