[コピペOK]Pythonで動画にカウントダウンタイマーを追加する方法!

この記事を書いた人

総合化学メーカーで研究開発・新規事業開発を担当。

化学や事業開発に関する情報を「分かりやすく、深く理解できる」ことを目指して発信中。

昨年は葛藤の中転職活動を行い、最初は苦労するも自らの視座が高まったことから転職活動についても積極的に情報発信しています!

👉【体験談】30代で大手化学メーカー研究職に転職!年収300万UPできた理由

業務効率化

※当サイトは、アフィリエイト広告を利用しています。

この記事ではOpenCVというライブラリを使用して、動画にタイマーを追加する方法をご紹介します。

コピペだけで以下のように簡単にタイマーを動画に入れることが可能です。

この記事で分かる事

  • 動画にタイマーを組み込む方法がわかります。
  • コピペするだけで、簡単におしゃれなタイマーを作ることができます。

また本記事ではスクリプトの各部分も詳しく説明し、各行のコードが何をしているのか、なぜそれが必要なのかを初心者にもわかりやすく解説します。

最後には、スクリプトをカスタマイズして、自分のニーズに合わせて動画にタイマーを追加できるようになりますのぜ是非参考にしてください。

OpenCVって何?

OpenCVは、”Open Source Computer Vision Library”の略で、動画に関するタスクを行うためのオープンソースのライブラリです。

スポンサーリンク

Pythonで動画にカウントダウンタイマーを追加する方法

とりあえずタイマーを動画に組み込みたい方は以下のコードで実行できます!

1つ1つの箇所に説明もいれていますので、参考に数字なども変えることで設定を変更できます。

import cv2 #cv2というライブラリを読み込みます。
import numpy as np

def add_timer_to_video(video_path, output_path):
    # ビデオを読み込む
    cap = cv2.VideoCapture(video_path)
    fps = int(cap.get(cv2.CAP_PROP_FPS))
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
    
    total_seconds = 25*60
    font = cv2.FONT_HERSHEY_COMPLEX  # フォントをおしゃれに
    font_scale = 6  # フォントサイズを大きくする
    font_thickness = 3
    color = (255, 255, 255)  # Red

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break

        # タイマーをテキストとして生成
        mins, secs = divmod(total_seconds, 60)
        secs = int(secs)
        timer_text = "{:02d}:{:02d}".format(int(mins), secs)

        # テキストのサイズを取得
        (text_width, text_height), _ = cv2.getTextSize(timer_text, font, font_scale, font_thickness)
        
        # テキストをフレームの右下に書き込む
        #x = width - text_width - 60  # 10pxのマージンを右に追加
        #y = height - 110  # 10pxのマージンを下に追加
        #cv2.putText(frame, timer_text, (x, y), font, font_scale, color, font_thickness, lineType=cv2.LINE_AA)
        
        # テキストをフレームの中心に配置
        x = (width - text_width) // 2
        y = (height + text_height) // 2
        cv2.putText(frame, timer_text, (x, y), font, font_scale, color, font_thickness, lineType=cv2.LINE_AA)

        # 更新後のフレームを保存
        out.write(frame)

        # 次の秒に進む
        total_seconds -= 1/fps

    cap.release()
    out.release()
    cv2.destroyAllWindows()


video_path = "C:/Users/obata/downloads/a.mp4"
output_path = "C:/Users/obata/デスクトップ/p2.mp4"
add_timer_to_video(video_path, output_path)
スポンサーリンク

コードの解説

add_timer_to_videoという関数を使って、入力動画に25分間のカウントダウンタイマーを追加し、新しい動画として保存します。

インポート

import cv2
import numpy as np

OpenCV(cv2)とnumpyをインポートしています。

numpyとは?

numpyはPythonのライブラリで、大量の数値データを効率的に扱ったり、数学的な計算を高速で行うための機能を提供しています。特に、ベクトルや行列などの配列計算に優れています。

関数定義

def add_timer_to_video(video_path, output_path):

add_timer_to_videoという関数を定義しています。この関数は2つの引数を持っています。

・video_path: 入力動画のパス

・output_path: タイマー付きの動画を保存するパス

動画の読み込みと基本情報の取得

cap = cv2.VideoCapture(video_path)
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))

ここでは入力動画を読み込み、基本情報(FPS、幅、高さ)を取得しています。また、出力動画の設定も行っています。

タイマーの設定

total_seconds = 25*60
font = cv2.FONT_HERSHEY_COMPLEX
font_scale = 6
font_thickness = 3
color = (255, 255, 255)

この部分で、タイマーとして表示するテキストの設定をしています。合計時間は25分(1500秒)です。

動画のフレームごとの処理

while cap.isOpened():

このループで、入力動画の各フレームを処理しています。

タイマーのテキストを生成

mins, secs = divmod(total_seconds, 60)
secs = int(secs)
timer_text = "{:02d}:{:02d}".format(int(mins), secs)

タイマーとして表示するテキストを生成しています。

テキストのサイズを取得

(text_width, text_height), _ = cv2.getTextSize(timer_text, font, font_scale, font_thickness)

テキストのサイズを取得しています。

テキストをフレームの中心に配置

x = (width - text_width) // 2
y = (height + text_height) // 2
cv2.putText(frame, timer_text, (x, y), font, font_scale, color, font_thickness, lineType=cv2.LINE_AA)

テキストを画像の中心に追加しています。

この数字の”2″を変えることで、タイマーを移動させることができます。

更新後のフレームを保存

out.write(frame)

更新後のフレームを出力動画に書き込んでいます。

次の秒に進む

total_seconds -= 1/fps

total_seconds -= 1/fps

リソースの解放

cap.release()
out.release()
cv2.destroyAllWindows()

動画の読み書きに使用したリソースを解放しています。

使用方法

video_path = "C:/Users/obata/downloads/a.mp4"
output_path = "C:/Users/obata/デスクトップ/p2.mp4"
add_timer_to_video(video_path, output_path)

この部分では、指定された入力動画に25分間のカウントダウンタイマーを追加し、新しい動画として保存しています。

コメント