やりたい事
python、ffmpegを使用して
サイズの違う複数の動画(音声、映像)自動で結合させたい
やった事
こちらのサイトを参照して作業を進めてみました
https://blog.shikoan.com/ffmpeg-python-concat/
まずはフォルダ、ファイルの用意をしていきます。
movie_conbine media hoge1.mp4 hoge2.mp4 hoge3.mp4 ... hoge15.mp4 a.py
実際のmp4ファイルの名前はhogeではありません。
こんな感じで用意してみました。
a.pyに下のコードを書き込みます。
python
1 2from tqdm import tqdm 3import ffmpeg 4import glob 5 6# videos = sorted(glob.glob("movei_combine\media*.mp4")) 7videos = glob.glob("movei_combine\media*.mp4") 8 9# 一旦テキストファイルに書き出す 10# 書き出さない方法は、あまりにファイル数が多い場合に「コマンド長すぎ」と怒られる 11with open("tmp.txt", "w") as fp: 12 lines = [f"file '{line}'" for line in videos] # file 'パス' という形式にする 13 fp.write("\n".join(lines)) 14# ffmpegで結合(再エンコードなし) 15ffmpeg.input("tmp.txt", f="concat", safe=0).output("out.mp4", c="copy").run()
こちらを実行すると
ターミナルには下の画像の様な実行結果が出ます
そして、movie_conbineフォルダ内に
新たにtmp.txtとout.mp4のファイルが作成されます。
movie_conbine media hoge1.mp4 hoge2.mp4 hoge3.mp4 ... hoge15.mp4 a.py out.mp4 tmp.txt
out.mp4 を開いてみると
最初の動画しか流れず
最初の動画の最後シーンでフリーズして
二個目以降は音声だけだったり、
途中で音声も流れなくなってしまいました。
調べた事
python 動画結合
python 動画結合 複数
とかでググり
①
openCVで動画を結合しようとしたのですがうまくいかず
teratailで質問をさせて頂いたところ
動画ファイルの「リサイズ」が必要との回答を頂きました。
https://teratail.com/questions/366379
②
openCVではなく
ffmpegでも動画の結合を無劣化で出来るという事で
ffmpegの動画結語をさせるコマンドを
ffmpeg -f concat -i indexfile.txt -c copy output.mp4
と
ffmpeg -safe 0 -f concat -i indexfile.txt -c:v copy -c:a copy -map 0:v -map 0:a output.mp4
をコマンドプロンプト上で実行しても
どっちも結果は同じでした。(今回のやった結果と)
③
そして今回の
pythonファイル上でffmegをやってみてうまくいかず
こちらに質問させて頂いた次第です。
質問
ffmpegの作業でも動画のリサイズは必要でしょうか?
何かすべきことやヒントなどあれば教えて頂けると幸いです。
もし、ffmpegでも動画のリサイズが必要であれば
また、調べて出直してきます。
追記
ffmpeg のバージョンは
ffmpeg version 4.4.1-essentials_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers
OSはWindows10になります。
ーー 複数個あるmp4ファイルのコーデック、フレームレート ーー
コーデックは全て同じでした。
ビデオコーデック avc1
オーディオコーデック 2 / 40 / mp4a-40-2
フレームレートは
合計15個ファイルがあり
最初の動画だけ 25.00 フレーム/秒
その他11個は 30.00 フレーム/秒
あと3つは 29.97 フレーム/秒
でした。
宜しくお願い致します。
あなたの回答
tips
プレビュー