LoginSignup
7
9

More than 3 years have passed since last update.

OpenCVを使って長い動画を一部だけ保存する方法

Last updated at Posted at 2019-11-12

きっかけ

グフ/増殖系YouTuber「NHK」で増えて「ぶっ壊す」で倍になる立花孝志 にsyncしました:rolling_eyes:
ちょうど良い動画素材で、領域分割・顔認識・テロップを消すには・・・などなど何かしらでopencvで出来そうです。
この動画は18分あるのですが候補者が登場する冒頭の1分だけを使いたいと思っています。
で、一部分だけ時間によって抽出する方法をpythonとOpenCVのみでやってみます。

元素材

NHKをぶっ壊す!【政見放送】 NHKから国民を守る党【立花 孝志他3名】全国比例区

方法

  • 元動画から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 とか使おうと思ったのですが、割とすんなり実装できました。 画像サイズを変えるとなぜかコーデックでミスります。

参考にしたリンク

7
9
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
7
9