Python 動画の再生速度を変更して保存する「OpenCV」

'22/09/03更新:動画編集の進捗状況をprint出力によりわかるようにしました。また、完了後に、処理に要した時間をprint出力するコードも追記しました。
 本記事では、表題の雛形コードを載せました。FPS(Frame Per Second)で速度調整します。一枚あたりのフレーム数の意味で、値が大きい程速くなります。実施例は下記リンクです。

www.youtube.com

■本プログラム

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import cv2
import time


# fpsを変更して動画を作成する関数
def movie2movie_fps_scale_func(input_file, out_file, fps_scale):
    
    # 入力ビデオをオブジェクトで取得
    video = cv2.VideoCapture(input_file)
    fps = int(video.get(cv2.CAP_PROP_FPS))
    width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
    num_of_frame = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    
    # 出力ビデオをオブジェクトで生成
    frame_rate = int(fps * fps_scale)
    print('frame_rate -> ', frame_rate)
    writer = cv2.VideoWriter(out_file,
                             cv2.VideoWriter_fourcc('m', 'p', '4', 'v'),
                             frame_rate,
                             (width, height),
                             True)

    # フレームを1枚ずつ取得しながら動画を生成
    for i in range(num_of_frame):
        ret, frame = video.read()
        if i % 100 == 0:
            print(i, '/', num_of_frame)
        #    cv2.imwrite('check_frame_' + str(i) + '.jpg', ret)
        writer.write(frame)
    
    # インスタンスをメモリから解放
    video.release()
    writer.release()
    

if __name__ == '__main__':
    # 実行開始の時間取得
    start_time = time.time()
    
    # オリジナル動画ファイルのパス
    input_video = 'IMG_5424.mp4'

    # FPSの倍速指定
    fps_scale = 20

    # 出力動画ファイルパス
    base_name = os.path.splitext(os.path.basename(input_video))[0]
    out_video = base_name + '_fps' + str(fps_scale) + 'times.mp4'

    # 関数の実行
    movie2movie_fps_scale_func(input_video, out_video, fps_scale)
    
    # 経過時間の計算
    processing_time = time.time() - start_time
    
    print('processing_time -> ', processing_time / 60, 'min')
    print("finished")

ちなみに、タートルグラフィックスを使う例は下記リンク先を参照下さい。

hk29.hatenablog.jp

倍速再生動画はこちらもどうぞ

www.youtube.com

以上

<広告>