0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonでフォルダ内のmp4動画を全画面で連続再生

Last updated at Posted at 2024-04-21

タイトルのままですね。
ドライブレコーダーの動画が1分単位のこま切れのmp4なので
見返す際に便利かなと思い作成しました。
あとスクリーンセーバーを想定している仕様です。
その理由は………大人の事情があったりなかったりします。

追記:OpenCVを使っているので動画は正常な再生速度では再生できません。

まず必要なライブラリをimport

import cv2
import glob
import random
import tkinter as tk

シャッフル再生する必要がなければrandomは要りません。

MP4ファイルが入っているフォルダを指定

# MP4ファイルが格納されたディレクトリを指定
mp4dir = r"I:\24年4月"

mp4ファイルの一覧を取得してリスト化

# mp4ファイルの一覧を取得してリスト化
mp4list = []
files = glob.glob(mp4dir + "\*.mp4")
for file in files:
    mp4list.append(file)
mp4list_count = len(mp4list)

# mp4ファイルのリストをシャッフルして再生したい場合は下記1行のコメントアウトを解除
# random.shuffle(mp4list)

リストの先頭のファイルを指定して開く

# 最初のmp4ファイル番号を指定
i = 0
cap = cv2.VideoCapture(mp4list[i])

# mp4ファイルの読み込みに失敗した際の処理
if (cap.isOpened()== False):  
    print("ファイルオープンに失敗しました") 

リサイズのためディスプレイサイズの取得

# ディスプレイサイズの取得
TkRoot = tk.Tk()
display_width = TkRoot.winfo_screenwidth()
display_height = TkRoot.winfo_screenheight()

全画面再生なのでマウス操作で終了したい

本当はスクリーンセーバーらしくマウスを動かしたら終了したいのですが、
うまくいかなかったのでクリック等で終了する様にしています。

def mouseEvents(event, x, y, flags, param):
    try:
        if event == cv2.EVENT_LBUTTONDOWN:
            # 左クリック時
            exit()
        elif event == cv2.EVENT_RBUTTONDOWN:
            # 右クリック時
            exit()
        elif event == cv2.EVENT_MBUTTONDOWN:
            # 中ボタンクリック時
            exit()
        elif event == cv2.EVENT_MOUSEWHEEL:
            # マウスホイール操作時
            exit()
    except Exception as e:
        print(e)

メインの処理

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        cv2.namedWindow('Video', cv2.WINDOW_NORMAL)
        cv2.setWindowProperty('Video', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
        frame = cv2.resize(frame, (display_width, display_height), interpolation=cv2.INTER_LINEAR)
        cv2.imshow('Video', frame)
        cv2.setMouseCallback('Video', mouseEvents)

        # ESCキーでも終了する
        if cv2.waitKey(25) & 0xFF == 27:
            break
    
    else:
        # ファイルの再生が終わったら次のファイルを再生する処理
        i += 1
        if i <= mp4list_count - 1:
            # 次のファイルを再生
            cap = cv2.VideoCapture(mp4list[i])
            cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
            continue
        else:
            # リストの末尾まで来ていたら、最初のMP4ファイルに戻って再生
            i = 0
            cap = cv2.VideoCapture(mp4list[i])
            cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
            continue
cap.release()
cv2.destroyAllWindows()

作成にあたり参考にさせて頂いた記事

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?