タイトルのままですね。
ドライブレコーダーの動画が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()
作成にあたり参考にさせて頂いた記事