Pythonによる動画再生をマスターしよう!シークバーでスムーズにナビゲートする方法

Pythonで動画を再生しながら、シークバーでスムーズにナビゲートする方法ってあるのかなぁ…初心者の僕でもできるのかな。
猫男
猫男
catman
catman
もちろんさ、catmanに任せておくんだ。Pythonで動画を再生しつつ、シークバーを使って動画の時間を調整するのは意外と簡単なことさ。ちょっとしたプログラムを書けば、あっという間にできるようになるんだ。

 

Pythonで動画再生を始める方法

Pythonで動画を再生するには、特定のライブラリを使うと便利です。ここでは、動画再生でよく使われるOpenCVを紹介します。

OpenCVを使うと、動画を読み込み、フレーム単位で表示できます。これにより、普段見ている動画プレーヤーのように再生ができます。

 

OpenCVで動画を再生するPythonコード

まずは、基本的な動画再生のコードを確認します。

import cv2

video_path = "video.mp4"
cap = cv2.VideoCapture(video_path)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    cv2.imshow('Video', frame)
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

このコードは、指定したパスの動画をOpenCVで読み込み、フレームごとに表示します。

 

コードの意味

ここで使われているクラスやメソッドを説明します。

  • cv2.VideoCapture(video_path)は、指定した動画ファイルを開き、フレームデータを取得するためのクラスです。
  • cap.read()は、新しいフレームを取得します。動画の終端に達するとFalseを返します。
  • cv2.imshow('Video', frame)は、フレームをウィンドウに表示します。
  • cv2.waitKey(30)は、30ミリ秒待ってから次のフレームを表示します。この待機時間を調整することで再生速度を変えることができます。
  • cap.release()は、使用したメモリやリソースを解放します。

 

これで動画が再生できるんですね!けど、シークバーはどうやって追加するんでしょう?
猫男
猫男
catman
catman
シークバーのためにはGUIライブラリを使うんだ。Pythonのtkinterを使えば、簡単にGUIを作成できるようにするんだ。さぁ、次はシークバーをつけてみよう。

 

シークバーを追加して動画をナビゲートする

Pythonには、tkinterという標準ライブラリがあります。これを使えば、シークバー付きの動画プレーヤーを作れます。

まずは、tkinterを用いて基本的なシークバーを追加してみましょう。

 

tkinterを使ったシークバー付き動画再生

import cv2
import tkinter as tk
from tkinter import ttk

class VideoPlayer:
    def __init__(self, root, video_path):
        self.cap = cv2.VideoCapture(video_path)
        self.root = root
        self.root.title("Video Player")
        self.position = tk.DoubleVar()
        
        slider = ttk.Scale(self.root, orient='horizontal', from_=0, to=self.cap.get(cv2.CAP_PROP_FRAME_COUNT), variable=self.position, command=self.seek)
        slider.pack(fill='x')

        self.root.after(0, self.next_frame)

    def next_frame(self):
        ret, frame = self.cap.read()
        if ret:
            cv2.imshow('Video', frame)
            self.position.set(self.cap.get(cv2.CAP_PROP_POS_FRAMES))
            if cv2.waitKey(30) & 0xFF == ord('q'):
                return
        else:
            self.cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
        self.root.after(30, self.next_frame)

    def seek(self, pos):
        self.cap.set(cv2.CAP_PROP_POS_FRAMES, float(pos))

root = tk.Tk()
VideoPlayer(root, "video.mp4")
root.mainloop()

このコードでは、tkinterを使ってシークバー付きの動画再生を実現しています。

 

コードの意味

以下、重要な部分を解説します。

  • tk.DoubleVar()は、シークバーの位置を保持する変数です。
  • ttk.Scaleは、スライダー(シークバー)を作成するためのウィジェットです。
  • slider.pack(fill='x')で、ウィンドウの横幅いっぱいにスライダーを配置します。
  • video.get(cv2.CAP_PROP_FRAME_COUNT)は、動画のフレーム数を取得します。これにより、シークバーの最大値として利用します。
  • self.seekは、シークバーを動かしたときに呼び出される関数で、動画のフレーム位置を変更します。
  • self.next_frameは、定期的に呼ばれることで次のフレームを表示します。

 

まとめ

Pythonで動画再生をマスターする道は、思ったよりも簡単です。OpenCVで動画を再生し、さらにtkinterでシークバーをつけることで、オリジナルの動画プレーヤーを作れます。

これをもとにカスタマイズを進めれば、自分仕様の動画再生ソフトを作ることも夢ではありません。

  • OpenCVで動画再生を簡単に実装できる。
  • tkinterでシークバーを追加できる。
  • GUIの知識を活かして、さらなる機能追加も可能。

ぜひPythonで動画再生の楽しさを体験してみてください。

 

Pythonでシークバー付きの動画再生がこんなに簡単にできるなんて!他のオプションも試してみたくなりました。
猫男
猫男
catman
catman
その意欲が大事だよう。Pythonと組み合わせて様々な機能のあるプレーヤーを自作する起点にできるんだ。次に進む時も、catmanに任せておけよ。

 

EARTHPG 自動化研究所

「その作業、仕組みにできます。」

Google Apps Script、Python、スプレッドシート自動化、WordPress開発、 API連携、AI活用まで対応。 小さな自動化から業務全体の設計まで、研究所が支援します。