
まくまく
OpenCVで動画ファイルを取得してループ再生してみようと思います。
動画再生の開始位置のみ指定する場合と、開始位置と終了位置の両方を指定する場合の2パターン作ってみました。
開始位置のみ指定する場合
開始位置のみ指定する場合はこちら。終了位置は動画の終了位置です。
#ライブラリのインポート
import cv2
#パラメーター
#開始位置(秒)を指定
start = 5
#VideoCapture オブジェクトを取得
cap = cv2.VideoCapture("movie.mp4")
#fps取得
fps = cap.get(cv2.CAP_PROP_FPS)
#動画の開始位置を設定
cap.set(cv2.CAP_PROP_POS_FRAMES, int(start*fps))
#動画の表示
while (cap.isOpened()):
#フレーム画像の取得
ret, frame = cap.read()
#画像の表示 無限ループ
if ret:
#画像の表示
cv2.imshow("Image", frame)
if cv2.waitKey(10) != -1:
break
else:
cap.set(cv2.CAP_PROP_POS_FRAMES, int(start*fps))
cap.release()
cv2.destroyAllWindows()
6行目の「start = 5」で動画の開始位置を指定します。ここでは秒数で指定しているので、これをフレームに変換するため14行目、27行目では「start*fps」というように時間とフレームレートを掛けています。
17行目から27行目は動画を無限ループで再生するよう、if文を用いて記載しています。指定した開始位置から再生され、動画の終了位置までいくと、elseで開始位置に戻るようになってます。
開始位置と終了位置の両方を指定する場合
#ライブラリのインポート
import cv2
#パラメーター
#開始位置と終了位置(秒)を指定
start = 5
end = 10
#VideoCapture オブジェクトを取得
cap = cv2.VideoCapture("movie.mp4")
#fps取得
fps = cap.get(cv2.CAP_PROP_FPS)
#現在フレーム取得
current_fps = cap.get(cv2.CAP_PROP_POS_FRAMES)
#動画の開始位置を設定
cap.set(cv2.CAP_PROP_POS_FRAMES, int(start*fps))
#動画の表示
while (cap.isOpened()):
ret, frame = cap.read()
if ret:
if current_fps < end * fps:
cv2.imshow("Image", frame)
if cv2.waitKey(10) != -1:
break
else:
cap.set(cv2.CAP_PROP_POS_FRAMES, int(start*fps))
cap.release()
cv2.destroyAllWindows()
上の例では、5秒から10秒までを無限ループ再生するようになっています。
ループ処理の流れとしては、こんな感じです。
①開始位置をフレームで指定
②現在のフレームが終了位置になるまで画像を表示
③終了位置になると、開始位置に移動してループ
②と③をぐるぐる回っていて、何かキーが押されるとループが終了します。
ただ気になるのは、終了位置から開始位置に戻る時に一瞬だけブラックアウトするのですよね。ここについてはもう少しうまい書き方があるかもしれませんね。
Python OpenCVを用いた動画編集についてはこちらの記事でまとめています。>>>Python OpenCVを用いた動画編集 使い方 まとめ