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 |
options | Video 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 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()