Pythonで動画を結合する方法 | Pythonで動画編集をする

2021年8月30日月曜日

Python 動画

t f B! P L

今回の内容

今回はPythonの動画編集編!第一弾として動画を結合する方法を紹介します。
ffmpegというツールを使うため、簡単なダウンロード等を最初にやっておいてください!

まずはffmpegをダウンロードする

https://github.com/BtbN/FFmpeg-Builds/releases
↑のサイトにアクセスし、
そしたら↓のリンクをクリックします(一致するものがない場合、win64-gpl-shared.zip が語尾についているものをクリックします)
※Windowsの場合。
Pythonで動画を結合する方法 | Pythonで動画編集をする

ダウンロードが完了したら一度、解凍し、↓のようにフォルダを開いていきます。

Pythonで動画を結合する方法 | Pythonで動画編集をする
あかいろで囲まれているのが必要なファイルです。このフォルダにパスを通しておいてもいいですが、それが面倒な場合はスクリプトファイル(Pythonファイル)と同じ場所に設置するようにします。

ffmpeg

先ほどダウンロードしたファイルは実行ファイルなので、コマンドラインツールとして使います。が、Pythonのコードでも使えます。
まずは、コマンドラインツールとして利用する場合、動画結合するにはどうするか紹介します。


まず最初に「list.txt」という名前のファイルを作成し、こう書き込んでください。
douga1.mp4
douga2.mp4
これはどういう意味かというと、結合したい動画のファイル名をどんどん書き込んでいくということです。
そしたらコマンドプロンプトで
ffmpeg -f concat -i list.txt -c copy output.mp4
で実行します。
すると完了します。

が、この記事のメインは「Python」なのでPythonのコードでやる方法も紹介します。

Pythonコード

まず最初にライブラリをインストールします。
pip install python-ffmpeg
そしていかのようにコードをかきます。
import ffmpeg
import os

videos = ["./douga1.mp4","./douga2.mp4"]
with open("tmp.txt", "w") as fp:
    txt = ["file " + fname for fname in videos]
    fp.write("\n".join(txt))
s = ffmpeg.input("tmp.txt", f="concat", safe=0, vsync=0)
r = s.output("out.mp4", c="copy")
r.run()
os.remove("tmp.txt")
Pythonで動画を結合する方法 | Pythonで動画編集をする
実行する前に、以下のようにファイルがあることを確認します。
そして実行すると、out.mp4が作成されています。

Non-monotonous DTS in output stream 0:0; ・・・

このような出力をされた場合は、多分二つの動画のfps数が一致していないからです。
オプション付ければ何とかなるでしょ~って思ってたらそう簡単にはいかないようです。

全ての動画で同じFPS数にしなければならないようです。
import ffmpeg
import os

videos = ["douga1.mp4","douga2.mp4"]
with open("tmp.txt", "w") as fp:
    txt = list()
    for fname in videos:
        txt .append("file tmp_" + fname)
        s = ffmpeg.input(fname, r=60)
        print(type(s))
        r = s.output("tmp_" + fname, c="copy")
        print(type(r))
        r.run(overwrite_output=True)
    fp.write("\n".join(txt))
s = ffmpeg.input("tmp.txt", f="concat", safe=0, r=5)
r = s.output("out.mp4", c="copy")
r.run()
os.remove("tmp.txt")
tmp + [動画名]というファイルが作成されてしまいますが、これでFPS数が違くても結合できます。
ここで注意ですが、このコードを利用する場合はvideos[]に絶対パスは入れないでください!!
ではないと「ファイルが存在しない」と怒られます。



今回はここまでにしたいと思います。
次回の動画編集編は...動画の切り取りについて紹介したいとおもいま~~す!
では。

このブログを検索

要望について

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

最近の出来事

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

アンケート

Welcome!

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

お問い合わせ

名前

メール *

メッセージ *

QooQ