Pythonでの動画編集について - cv2, Pillow, ffmpegで動画編集をする

2021年8月28日土曜日

t f B! P L
Pythonで動画編集をする方法を紹介します。
これはあくまで解説をする記事なので、具体的なサンプルコードなどは今度、別の記事で紹介します。

moviepyは使えない

moviepyはあまり使えません。理由は、長い動画だとバグっておかしくなるからです。
そして自分がやりたいような具体的な編集ができないからです。

cv2,PILで動画編集をする手順

このような感じになります。

1.FPS数などの情報を取得する
2.一コマ一コマ分ける
3.一コマ一コマ編集する
4.合体する
5.音声と合体する

1.FPS数などの情報を取得する

        cap = cv2.VideoCapture(sys.argv[1])
        fps = cap.get(cv2.CAP_PROP_FPS)
        width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
        height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
cv2を利用して動画の情報を取得できます。
FPS数の他に、解像度などを取得できます。縦、横、の長さです。

2と3.一コマ一コマ分ける / 編集する

これ見たらびっくりします。20FPSというのは、一秒間に20コマあるということになります。
つまり1分の動画 だけでも、1200コマあるということです。
        fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
        print(fps)
        out = cv2.VideoWriter('output.mp4', fourcc, fps, (width, height))
        print("変換が完了しました。")
        print("字幕を付けます")
        i = 0
        toTime = int(self.textctrl.GetValue())
        fromTime = int(self.textctrl2.GetValue())
        while True:
            ret, frame = cap.read()
            if ret:
                frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                pil_image = Image.fromarray(frame_rgb)
                draw = ImageDraw.Draw(pil_image)
                #ここに処理
                rgb_image = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
                out.write(rgb_image)
                i=i+1
            else:
                break
これで一コマ一コマ分断できました。それで一コマ一コマ編集していくわけですが

そんなんやってたら日が暮れるわ!ってなりますよね。

ですが、例えば、ずっと「あいうえお」と動画に表示させるようにするには繰り返し処理のなかで毎回drawTextなどでテキストを描画していればいいので、
そんなに時間はかかりません。
時間を指定してテキストを描画したい場合は、FPS × 字幕の表示開始時間(秒) と FPS × 字幕の表示終了時間(秒) という計算をつかって、
繰り返し処理の中でいかのようにします。
                if i <= startTime*fps and i >= endTime*fps:
                    font = ImageFont.truetype('C:\\Windows\\Fonts\\HGRGE.TTC', 40)
                    draw.text((50, 300), self.textctrl3.GetValue(), font=font)
このようにすれば期間を指定してテキストを描画できます。

4.合体する

一コマ一コマの編集が終わったら、あとはそれを合体して一つの動画にする必要がありますね。
その処理は既にやっていて、この部分です。
out.write(rgb_image)
この部分で書き込んでいます。
あとは
        cap.release()
        out.release()
これを書いて完了です。と思ったら、、、

5.音声と合体する

なんとこのままでは音声なしの動画となります。
どうしてかというと、今やっているのは画像処理です。
その画像をつなげても音声のデータは入っていないため、ダメになります。
なので、ffmpaegなどを利用して音声と合体してやる必要があります。
        subprocess.call("ffmpeg -i output.mp4 -i audio.wav -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output2.mp4")

ffmpegだけでの動画編集でできること

ffmpegでは簡単な基本的な動画編集がおこなえます。
動画カットや、音声結合、動画結合、動画分断などは全てffmpeggやってくれます。
字幕をつけるのもがんばればできます。


これからの記事で詳しく紹介します。

このブログを検索

要望について

ブログのレイアウトやテーマについての提案をいただきました。現在qooqテーマを適応中です。 語尾を自動でつけるプログラムを作りたいという要望をいただきました。是非紹介したいですがどの言語でどのようなプログラムかなど、お問い合わせフォームで詳しく教えてください!

最近の出来事

最近の出来事
寿司打お勧め75位♪(練習モードだけど)

アンケート

Welcome!

「プログラミング独学ブログ」へようこそ。 Yakinyといいます。幅広い範囲で投稿していますので、ぜひ過去の記事も見てみてください!!コメントも大歓迎です!更新がとまってしまって申し訳ございません

お問い合わせ

名前

メール *

メッセージ *

QooQ