茨城エンジニアのPython開発日記

茨城のITベンチャー企業ではたらく2年目エンジニア。Pythonで色々なものを作成中。

avi合体ツールつくってみた


ブログから記事を見つけたい場合はこちら

ブログ地図 - 茨城エンジニアのPython開発日記


こんにちは松原です。


aviを縦に並べて合体するツールを作りました。

こんな感じに動きます。


いくらでも既製品があるだろうけど、このくらいなら探すより作った方が楽ですね。

突貫で作った美しさのかけらのないコードですが、忘備録もかねて公開しておきます
ちなみに参考にしたサイト様はこちら
【python/OpenCV】OpenCVで動画ファイルの読み込みと保存の方法 - ソースに絡まるエスカルゴ

import cv2
import sys
import tkinter as tk
import numpy as np
from datetime import datetime as dt

#参考にしたサイトhttps://rikoubou.hatenablog.com/entry/2019/01/15/174751

#グローバル変数として保持
avi_path_1 = "temp"
avi_path_2 = "temp"

#ウィンドウ生成
root = tk.Tk()
root.title(u"avi合体")
root.geometry("550x130")

# テキストボックス
txt1 = tk.Entry(width=80)
txt1.place(x=20, y=10)
txt2 = tk.Entry(width=80)
txt2.place(x=20, y=30)

###################
#######合体実施#####
###################
def exe_gattai():

    width = 500
    height = 300
    
    img_size = (width, height)
    result_size = (width, 2*height)

    #aviパス取得
    avi_path_1 = txt1.get()
    avi_path_2 = txt2.get()

    video1 = cv2.VideoCapture(avi_path_1)
    video2 = cv2.VideoCapture(avi_path_2)

    #フレーム数取得
    frame_cnt_1 = int(video1.get(cv2.CAP_PROP_FRAME_COUNT))
    frame_cnt_2 = int(video2.get(cv2.CAP_PROP_FRAME_COUNT))

    #フレームレート取得(同じと想定)
    frame_rate = int(video2.get(cv2.CAP_PROP_FPS))

    #タイムスタンプ取得
    tdatetime = dt.now()
    tstr = tdatetime.strftime('%Y%m%d_%H%M%S')

    # 保存用
    fmt = cv2.VideoWriter_fourcc('m''p''4''v')
    writer = cv2.VideoWriter('./result/' + tstr + 'result.avi', fmt, frame_rate , result_size)

    #フレームループ
    for frame_cnt in range(max([frame_cnt_1, frame_cnt_2])):
        
        print(frame_cnt)

        #画像初期化
        frame1 = np.zeros((width, height, 3), np.uint8)
        frame2 = np.zeros((width, height, 3), np.uint8)
        
        if frame_cnt < frame_cnt_1:
            ret1, frame1 = video1.read()

        if frame_cnt < frame_cnt_2:
            ret2, frame2 = video2.read()
        
        #リサイズ
        frame1 = cv2.resize(frame1, img_size)
        frame2 = cv2.resize(frame2, img_size)

        #画像の結合
        iframe_output = cv2.vconcat([frame1, frame2])

        ### ここに加工処理などを記述する ###
        writer.write(iframe_output)

    print("finish!!!!!!!!!!!!!!!")


#書き込みボタンの作成
btn = tk.Button(text='合体', command = exe_gattai)

btn.place(x=130, y=90#ボタンを配置する位置の設定
root.mainloop()

機能はみたままです。

それではまた今度。