wxPythonで動画プレイヤーを作成してみる wx.MediaCtrl

2021年7月9日金曜日

Python wxPython

今回の内容

今回はスライダーとMediaCtrlを組み合わせてまぁまぁ本格的な動画プレイヤーを作っていきたいと思います。

ソースコード

import wx
import wx.media as media
import math
class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,"ウィンドウ",size=(700,600))
        panel = wx.Panel(self,-1)
        self.mediapanel = wx.Panel(panel,-1)
        self.mediactrl = media.MediaCtrl(self.mediapanel,style=wx.SIMPLE_BORDER,szBackend=wx.media.MEDIABACKEND_WMP10,size=(600,340))
        mediasizer = wx.BoxSizer()
        mediasizer.Add(self.mediactrl)
        self.mediapanel.SetSizer(mediasizer)
        self.slider = wx.Slider(panel, -1, 1000, 0, 1000,style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS)
        self.mediactrl.Load("movie.mp4") #動画のパスを指定
        self.mediactrl.Play() #動画を再生
        buttonpanel = wx.Panel(panel,-1)
        #各ボタンの設置
        button_play = wx.Button(buttonpanel,-1,"再生")
        button_play.Bind(wx.EVT_BUTTON,self.PlayMedia)
        button_pause = wx.Button(buttonpanel,-1,"一時停止")
        button_pause.Bind(wx.EVT_BUTTON,self.PauseMedia)
        button_stop = wx.Button(buttonpanel,-1,"停止")
        button_stop.Bind(wx.EVT_BUTTON,self.StopMedia)
        #各ボタンのレイアウト
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(button_play)
        sizer.Add(button_pause)
        sizer.Add(button_stop)
        buttonpanel.SetSizer(sizer)
        #各ウィジェットのレイアウト
        mainsizer = wx.BoxSizer(wx.VERTICAL)
        mainsizer.Add(self.mediapanel,4,wx.EXPAND)
        mainsizer.Add(self.slider,1,wx.EXPAND)
        mainsizer.Add(buttonpanel,1,wx.EXPAND)
        panel.SetSizer(mainsizer)
        #スライダーのイベント
        self.slider.Bind(wx.EVT_SLIDER, self.onSeek)
        #リアルタイムでスライダーに反映させる
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.onTimer)
        self.timer.Start(1000)
    def onSeek(self,event):
        # スライダーのイベント
        offset = self.slider.GetValue()
        self.mediactrl.Seek(math.ceil(offset*1000))
        self.mediactrl.Play()
    def onTimer(self,event):
        # リアルタイムでスライダーに反映
        offset = self.mediactrl.Tell()
        self.slider.SetValue(math.ceil(offset/1000))
    def PlayMedia(self,event):
        #メディアを再生
        self.mediactrl.Play()
        self.slider.SetRange(0, math.ceil(self.mediactrl.Length()/1000))
    def PauseMedia(self,event):
        #メディアを一時停止
        self.mediactrl.Pause()
    def StopMedia(self,event):
        #メディアを停止
        self.mediactrl.Stop()
        
app = wx.App(False)
MyFrame().Show(True)
app.MainLoop()


wxPythonで動画プレイヤーを作成してみる wx.MediaCtrl

解説

だいぶ長いコードになり、動作もスライダーの影響で遅くなりました。
まずこのコードでやっていることは、
1.MediaCtrlの設置
2.Sliderの設置
3.MediaCtrlへファイルを読み込ませる
4.各ボタンを設置
5.再生ボタンが押されたら
  MediaCtrlを再生させ、Sliderを動画の長さにあわあせる
6.一時停止ボタンが押されたら
  MediaCtrlをポーズさせる
7.停止ボタンが押されたら
  MEdiaCtrlを停止させrt
8.Timerイベントを利用してSliderに現在の再生位置を入れる

って感じです。

注意事項

環境によってだいぶ動作がことなります。
このコードはWindows環境で動作するもので、LinuxやMacでは動作しません。

さいごに

このコードには不備がおおいです。
そのようなものを発見された場合は、コメントで教えてください!



コメント気軽にどうぞ!!!!
記事がよかったらシェアなどもお願いします!!!!

wxPythonの今スグ使えるサンプル集18個!GUI開発をマスターしよう!

今回はwxPythonのサンプルを18個紹介したいと思います。
wxPythonはウィジェットが豊富で自由度が高いので、応用するといろいろなツールが作成できます。

ページ

QooQ