今回の内容
今回はPythonの動画編集編!第一弾として動画を結合する方法を紹介します。ffmpegというツールを使うため、簡単なダウンロード等を最初にやっておいてください!
まずはffmpegをダウンロードする
https://github.com/BtbN/FFmpeg-Builds/releases↑のサイトにアクセスし、
そしたら↓のリンクをクリックします(一致するものがない場合、win64-gpl-shared.zip が語尾についているものをクリックします)
※Windowsの場合。
ダウンロードが完了したら一度、解凍し、↓のようにフォルダを開いていきます。
あかいろで囲まれているのが必要なファイルです。このフォルダにパスを通しておいてもいいですが、それが面倒な場合はスクリプトファイル(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")実行する前に、以下のようにファイルがあることを確認します。
そして実行すると、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[]に絶対パスは入れないでください!!
ではないと「ファイルが存在しない」と怒られます。
今回はここまでにしたいと思います。
次回の動画編集編は...動画の切り取りについて紹介したいとおもいま~~す!
では。
0 件のコメント:
コメントを投稿