きっかけ
グフ/増殖系YouTuber の 「NHK」で増えて「ぶっ壊す」で倍になる立花孝志 にsyncしました
ちょうど良い動画素材で、領域分割・顔認識・テロップを消すには・・・などなど何かしらでopencvで出来そうです。
この動画は18分あるのですが候補者が登場する冒頭の1分だけを使いたいと思っています。
で、一部分だけ時間によって抽出する方法をpythonとOpenCVのみでやってみます。
元素材
方法
- 元動画からfps(1秒あたりのフレーム数)を抽出する
-
開始時間 * fps
or終了時間 * fps
でフレーム数を計算する
time.time()
で計測しようとしたのですがフレーム数ベースで制御した方が成功しました。
また、候補者が登場する冒頭の1分
なので
- 開始時間 = 30秒
- 終了時間 = 90秒
としました。
開発
import cv2
if __name__ == '__main__':
cap = cv2.VideoCapture('drop_out_nhk.mp4')
cap_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
cap_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
writer = cv2.VideoWriter('one_minutes.mp4',fourcc, fps, (cap_width, cap_height))
# 抽出したい開始or終了時間
begin = 30
end = 90
for i in range(end * fps):
ret, frame = cap.read()
if ret:
if begin * fps < i:
writer.write(frame)
writer.release()
cap.release()
結果
多分これでちょうど1分になったと思います。
おわりに
asyncio
とか使おうと思ったのですが、割とすんなり実装できました。 画像サイズを変えるとなぜかコーデックでミスります。
参考にしたリンク
- OpenCV-Python ファイルから動画を読み込む
- [OpenCV - VideoCapture / VideoWriter で動画の読み込み/書き込みを行う。] (https://www.pynote.info/entry/opencv-video-capture-and-writer)