PythonでMP3再生(再生情報更新)
前回の記事内で
タイマー機能(DelphiコンポーネントのTTimer)に相当する機能をライブラリにまとめたことで、いろいろ見通しが良くなりました。再生情報を、TTimer使ってたとえば1秒おきに表示内容更新してみます。
再生位置表示と、音量変更を試す
just_playbackライブラリの解説から
playback.duration でセットされている曲の長さ(秒数)が
playback.curr_pos で現在の再生位置(秒数)が取得できることがわかります。ということは playback.curr_pos/playback.durationの値を使って、現在の再生位置をプログレスバーで表示できそうです。
また、ボリュームをスライダーで表示、可変にするなんてこともできそうです。
ライブラリの実装
ライブラリのファイルplayer_lib.py 内のMyPlayerのクラスに、現在位置curr_pos、全体長さ duration、音量 volume それぞれの読み出し(ゲッター)メソッド、とvolumeの書き込み(セッター)のメソッドを実装しました。
def get_curr_pos(self):
return self.playback.curr_pos
def get_duration(self):
return self.playback.duration
def get_volume(self):
return self.playback.volume
def set_volume(self, vol):
self.playback.set_volume(vol)
GUI
ライブラリのメソッドを使って取得したデータを、Label,ProgressBar や Sliderで表示します。
これらを使います。
Appのinit内で(抜粋)
# 全体長さ表示
self.label_duration = ctk.CTkLabel(self, text="曲の長さ")
self.label_duration.pack()
# 再生位置表示
self.label_currpos = ctk.CTkLabel(self, text="再生位置")
self.label_currpos.pack()
# プログレスバーWidget
self.progressbar = ctk.CTkProgressBar(self, width=200, height=8)
self.progressbar.pack(padx=50, pady=10)
# VOL
self.label_volume = ctk.CTkLabel(self, text="VOL")
self.label_volume.pack()
# スライダーボリュームWidget
self.slider_volume = ctk.CTkSlider(
self,
width=200,
height=8,
from_=0,
to=1.0,
command=self.slider_event,
)
self.slider_volume.pack(padx=50, pady=10)
self.slider_volume.set(self.player.get_volume())
# 表示更新用
self.timer1 = TTimer(self, self.task_updatedisp, interval=1000)
スライダースライド(音量変更)時のイベント
def slider_event(self, value):
self.player.set_volume(value)
表示更新の処理
def task_updatedisp(self):
# self.label_disptime.configure(text=time.strftime("%H:%M:%S"))
duration = self.player.get_duration()
self.label_duration.configure(text=f"長さ:{duration:.1f}")
curr_pos = self.player.get_curr_pos()
self.label_currpos.configure(text=f"位置:{curr_pos:.1f}")
self.progressbar.set(curr_pos / duration)
動作テスト
実行の様子を例によって動画で。
テスト用のmp3ファイルには、「甘茶の音楽工房」様の「残業戦士」
という曲を使わせていただいています。