【Python】Kivyで音楽を再生する方法

こんにちは、にわこまです!

今回はkivyで音楽を再生する方法を紹介します。とても簡素に作っています。ゆえに、音楽を再生する方法の基礎が分かります。

 

 

スポンサードサーチ


完成イメージ

今回作成するアプリケーションの完成イメージを以下に示します。

 

上部にラベルを作成します。このラベルには現在再生している音声ファイルを表示します。

ラベルの下にシークバーを作成します。現在の再生位置を示します。

シークバーの下にラベルを作成します。このラベルには現在の再生時間を示します。

ラベルの下にボタンを作成します。再生と停止機能を持たせます。

 

 

Audio

上記で示したアプリケーションを実現するためのファイル一覧を以下に示します。

current_directory
  ├ main.py       # 実行ファイル
  ├ my_screen.kv  # 画面のデザインファイル
  └ my_screen.py  # アプリケーションの機能を記載しているファイル

 

上記で示したmy_screen.pyファイルを以下に示します。

from kivy.clock import Clock
from kivy.core.audio import SoundLoader
from kivy.uix.screenmanager import Screen

# load kv files
from kivy.lang import Builder
Builder.load_file("./my_screen.kv")


class MyScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        self.interval = 0.1
        self.music_file_path = "./mei_kara_mei_switch1.mp3"

        # Label
        self.ids.lb_file_path.text = self.music_file_path

        # SoundLoader
        self.sound = SoundLoader.load(self.music_file_path)
        self.sound.bind(on_play=self.on_play_sound)
        self.sound.bind(on_stop=self.on_stop_sound)

        # Slider
        self.ids.slider.max = self.sound.length
        self.ids.slider.step = self.interval
        self.ids.slider.bind(value=self.update_time_code)

        # Button
        self.ids.btn_play_and_stop.bind(on_press=self.on_press_btn_play_and_stop)

    def on_enter(self, *args):
        self.update_time_code()

    def on_play_sound(self, *args):
        # 再生開始位置を設定
        self.sound.seek(self.ids.slider.value)
        # ボタンテキスト更新
        self.ids.btn_play_and_stop.text = "Stop"
        # 定期的にシークバーを更新
        self.clock_event = Clock.schedule_interval(self.update_slider, self.interval)

    def on_stop_sound(self, *args):
        # ボタンテキスト更新
        self.ids.btn_play_and_stop.text = "Play"
        
        # 停止
        Clock.unschedule(self.clock_event)

        if (self.ids.slider.max - self.ids.slider.value < self.interval):
            # 差分がインターバル未満の場合、シークバーを初期化
            self.ids.slider.value = 0

    def update_slider(self, dt):
        self.ids.slider.value = self.sound.get_pos()

    def update_time_code(self, *args):
        # 省略

    def on_press_btn_play_and_stop(self, instance):
        if (self.sound.state == "play"):
            self.sound.stop()
        else:
            self.sound.play()

全てのソースコードはこちらからダウンロードできます。

 

 

解説

14行目は更新間隔(秒)を定義しています。シークバーを更新する際に必要です。

15行目は再生対象の音楽ファイルパスを定義しています。

18行目は上部のラベルテキストにファイルパスを代入しています。

 

21行目は音声ファイルからサウンドオブジェクトを作成しています。KivyにはSoundオブジェクトがありますが、SoundLoader.load関数で作成します。

22行目は再生された際に実行する関数を定義しています。

23行目は停止された際に実行する関数を定義しています。

 

26行目はシークバーの最大値にサウンドの長さを代入しています。

27行目はシークバーのステップに更新間隔を代入しています。今回の場合、0.1ずつ動かすことができます。

28行目はシークバーの値が変更された際に実行する関数を定義しています。

 

31行目は再生/停止ボタンがクリックされた際に実行する関数を定義しています。

36行目から42行目は再生時に実行する関数を定義しています。

38行目は再生位置を設定しています。ゆえに、シークバーを移動させてから再生することで途中から再生できます。

40行目は再生/停止ボタンのテキストを更新しています。

42行目はクロックオブジェクトを作成しています。更新間隔と更新時に実行する関数を定義しています。

 

44行目から53行目は停止時に実行する関数を定義しています。

46行目は再生/停止ボタンのテキストを更新しています。

49行目は上記で定義したクロックオブジェクトを削除しています。

51行目から53行目は差分がインターバル未満の場合、シークバーを初期化しています。ゆえに、再生を途中で停止した場合はその位置から再生できます。

 

55行目と56行目は再生位置をシークバーの値に代入しています。

 

61行目から65行目は再生/停止ボンタがクリックされた場合に実行する関数を定義しています。

音声が再生中にクリックされた場合は音声を停止します。

音声が停止中にクリックされた場合は音声を再生します。

 

 

スポンサードサーチ


動作確認

動作確認を実施します。

コードを保存し、コマンドプロンプトを開きます。コードを保存したフォルダまで移動し、以下のコマンドを実行します。

python main.py

 

まとめ

今回はkivyを音楽を再生する方法を紹介しました。

必要最低限の機能を紹介しました。

 

何かお困りがあればメールにてお問い合わせお願いします。

 

 

最後までお読みいただきありがとうございます。


スポンサードサーチ