[Kivy] kivy.uix.videoで動画を再生する

kivy.uix.videoで動画を再生する

 Kivyで動画ファイルを再生するには、kivy.uix.vidoeplayerもしくはkivy.uix.videoを使用します。kivy.uix.videoplayerは、再生/停止、音量、位置の制御がデフォルトで付いており便利なのですが、①ボタンサイズを変更したり、②一定量再生位置を移動(例:2秒早送り)したりすることができません。これらを実施するためには、kivy.uix.videoを使用して自分でそれらを作成する必要があります。

 今回は、kivy.uix.videoを使用して動画ファイルを操作(再生、停止、再生位置の変更)する方法を紹介します。

kivy.uix.videoによる動画ファイルの操作

前準備

 以下のコマンドを実行して、kivyに必要なビデオ操作についてのバックエンドをインストールします。

 pip install kivy[media]

再生する動画ファイルを指定

 再生する動画ファイルの指定は、Videoのsourceを使用して以下のようにおこないます。

        # 動画ファイルの読み込み
        self.ids.video.source = 'out.mp4'

動画の再生と停止

 動画ファイルの再生、停止は、Videoのstateの値を指定することでおこないます。再生する場合は、stateに’play’、停止する場合はstateに’stop’を指定します。

    # 動画ファイルを再生する
        self.ids.video.state = 'play'

        # 動画ファイルを停止する
        self.ids.video.state = 'stop'

動画の再生位置の指定

 動画の再生位置を指定するには、seekを使用します。seekで指定する再生位置は、動画ファイルの長さに対する割合(0〜1の範囲)で指定します。
 このため、所定の秒数だけ再生位置を移動するためには、移動したい位置の秒数をduration(動画の総再生時間:秒数)で割って使用して計算します。現在の動画の表示位置は、positionにより取得で切るので、2秒前に戻す場合は以下のようにします。

        # 再生位置の計算 (2秒戻す)
        pos = (self.ids.video.position - 2) / self.ids.video.duration
        self.ids.video.state = 'play'
        # 再生位置の移動
        self.ids.video.seek(pos, True)

kivy.uix.vidoeについて

 kivy.uix.videoには、以下のプロパティやイベントが含まれており、これらを使用することで動画の操作を行います。

kivy.uix.video.Videoのプロパティ

プロパティ内容
duration動画の総再生時間(秒)NumericProperty
既定値: -1
eos動画ファイルの再生が終了したかBooleanProperty
既定値:False
loaded動画ファイルが読み込まれて、再生の準備が
完了しているか
BooleanProperty
既定値:False
optionsVideo core object作成時に渡すオプションObjectProperty
既定値:{}
position動画の表示位置(秒)NumericProperty
既定値: -1
preview動画の開始前に表示される
プレビュー画像のファイル名
StringProperty
既定値:None
stateビデオの状態を指示
‘play’, ‘pause’, ‘stop’のいずれか
OptionProperty
既定値:’stop’
volume音量(範囲: 0-1)1が最大音量、0がミュート   NumericProperty   
既定値: 1

kivy.uix.video.Videoのイベント

イベント内容
seek(percent, precise=True)percent: 再生位置 したい位置/ 全再生時間の値 (範囲: 0-1)
precise: 正確な場所の移動をおこなうかどうか
bool 既定値:True
unload()動画ファイルを解放する

サンプルプログラム

 以下のサンプルプログラムは、動画ファイル(out.mp4)を表示するものです。画面したの4つのボタンを押すことで、動画ファイルを操作します。
   Playボタン:  動画ファイルの再生
   stopボタン: 動画ファイルの停止
   fbボタン:  動画ファイルを2秒戻す
   ffボタン:  動画ファイルを2秒進める

※ プログラムを動作させるため、適当な動画ファイル(mp4)をプログラムと同じフォルダにファイル名をout.mp4にして保存して下さい。

kivy.uix.videoで作成した動画ファイルの再生プログラム画面
#:kivy 2.0


<VideoTestWidget>:
    BoxLayout:
        size: root.size
        orientation: 'vertical'
        spacing: 10
        padding: 20
        canvas.before:
            Color:
                rgba: 0.7, 0.7, 0.7, 1
            Rectangle:
                size: self.size
                pos: self.pos

        Video:
            id: video

        BoxLayout:
            size_hint: 1, 0.2
            orientation: 'horizontal'
            spacing: 20

            Button:
                id: play_button
                text: 'play'
                on_press: root.on_play_press()

            Button:
                id: stop_button
                text: 'stop'
                on_press: root.on_stop_press()

            Button:
                id: fb_button
                text: 'fb'
                on_press: root.on_fb_press()

            Button:
                id: ff_button
                text: 'ff'
                on_press: root.on_ff_press()
# -*- coding: utf-8 -*-

import os
import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.lang import Builder

kivy.require('2.2.0')
Builder.load_file(os.path.dirname(__file__) + "/interface.kv")

# 画面サイズの指定
Window.size = (640, 600)


class VideoTestWidget(Widget):

    def __init__(self, **kwargs):
        super(VideoTestWidget, self).__init__(**kwargs)

        # 画像ファイルの読み込み
        self.ids.video.source = 'out.mp4'
        self.position = 0

    # 再生ボタン(play)の処理
    def on_play_press(self):
        pos = self.position / self.ids.video.duration
        self.ids.video.state = 'play'
        self.ids.video.seek(pos, True)

    # 停止ボタン(stop)の処理
    def on_stop_press(self):
        self.ids.video.state = 'stop'
        self.position = self.ids.video.position

    # 巻き戻しボタン(fb)の処理
    def on_fb_press(self):
        pos = (self.ids.video.position - 2) / self.ids.video.duration
        self.ids.video.state = 'play'
        self.ids.video.seek(pos, True)

    # 早送りボタン(ff)の処理
    def on_ff_press(self):
        pos = (self.ids.video.position + 2) / self.ids.video.duration
        self.ids.video.state = 'play'
        self.ids.video.seek(pos, True)


class VideoTestWidgetApp(App):
    def __init__(self, **kwargs):
        super(VideoTestWidgetApp, self).__init__(**kwargs)
        self.title = 'VIdeo Test'

    def build(self):
        return VideoTestWidget()


if __name__ == '__main__':
    app = VideoTestWidgetApp()
    app.run()
タイトルとURLをコピーしました