見出し画像

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ファイルには、「甘茶の音楽工房」様の「残業戦士」

という曲を使わせていただいています。

いいなと思ったら応援しよう!