とっちゃん@nyanco! です。
今回は無料で動画を再エンコードせずに指定した回数分リピート結合させて1つの動画データにするpythonコードを作成したので共有するよというお話です。
筆者はこれで20分ほどの動画を12時間動画に仕上げてますにゃ~
再エンコしないので爆速&劣化なしですにゃ~!
コードの動作環境
- OS:Windows10 / macOS Ventura
- Pythonバージョン:3.11.2
- 必要ライブラリ:
- subprocess(python標準ライブラリなのでインストール不要)
- os(python標準ライブラリなのでインストール不要)
使用するライブラリはPythonデフォルトのものなので別途インストールは不要ですが、外部ツールとしてシステムにFFmpeg(エフエフエムペグ)というフリーのソフトウェアがインストールされている必要があります。
やりたいこと
今回やりたいことは以下の通り。
- 「イントロ用の動画」と「ループ可能動画を指定回数結合」させて1つの動画データにする
- 再エンコードなし
蛇足ですが、このスクリプトを作成するに至った経緯を簡単に。
Meow ChillというYouTubeチャンネルで、約12時間という長尺のチルアウト系BGM動画を投稿しているのですが、Premiere Proから12時間の動画を普通に書き出そうとすると8~24時間くらいかかり、エラー頻発、冷却ファンは唸りっぱなし、挙句の果てに書き出された動画は音飛びしている…というなかなか厳しい状況でした。
そこから色々試行錯誤して思いついたのが、Premiereではループできる短い動画を書き出し、それを任意の回数分繋ぎ合わせるという方法だったのですが、既存のフリーソフトではなかなか思うようにできず…
ちなみにその過程で見つけた動画を無劣化で色々処理できる「LosslessCut」というソフトは別の用途ではとても便利に使えそうですにゃ~
最終的にたどり着いたのが、生成AIにズバリなPythonコードを生成してもらうという方法でした。
生成AIとPythonのタッグは最強ですにゃ~
無料で動画を再エンコせずループ結合させるコード
早速ですがコードはこちら!
import subprocess
import os
def concat_video_with_intro(input_file, intro_file, output_file, repeat_count):
# 一時的なテキストファイルを作成
with open('temp_file_list.txt', 'w') as f:
f.write(f"file '{intro_file}'\n")
for _ in range(repeat_count):
f.write(f"file '{input_file}'\n")
# FFmpegコマンドを構築
ffmpeg_command = [
'ffmpeg',
'-f', 'concat',
'-safe', '0',
'-i', 'temp_file_list.txt',
'-c', 'copy',
output_file
]
# FFmpegを実行
subprocess.run(ffmpeg_command, check=True)
# 一時ファイルを削除
os.remove('temp_file_list.txt')
# 動画データセット ※自分でセットする
intro_video = 'intro.mp4' #冒頭に配置したい動画データを設定
input_video = 'main.mp4' #リピートさせたい動画データを設定
repeat_count = 5 #input_videoに設定した動画をリピートさせる回数
output_video = 'output.mp4' #出力される動画データを設定
concat_video_with_intro(input_video, intro_video, output_video, repeat_count)
コードは自動生成AI「perplexity」で作成したものを元に少しカスタマイズしています。
自分用に設定する箇所は以下の通りです。
- 28行目:イントロ動画として使用したい動画データのファイルパスを指定(イントロ動画不要の場合は、29行目と同じ動画ファイルを指定してリピート回数を-1回すると良いです)
- 29行目:リピートさせたい動画データのファイルパスを指定
- 30行目:29行目で指定した動画データをリピートさせたい回数を指定
- 31行目:出力データのファイルパスを指定(ディスクの空き容量に注意!)
動画データと同じフォルダにPythonファイルを入れておくと、ファイル名の設定だけでOKなので楽ですにゃ~
注意点としては、元になる動画データサイズが大きかったりリピートする回数が多過ぎたりすると出力ファイルサイズが非常に大きくなり、出力先のディスクの空き容量が足りずエラーになることがあるので、予めディスクに十分な空きがあるか確認しておく必要があります。
参考までに、約12時間の動画だと40~90GB(ギガバイト)くらいのファイルサイズとなります。
各動画データのセットさえできればあとは簡単です。
▼Pythonコードを実行すると、このようにコマンドプロンプト(macOSならターミナル)ウィンドウで指定したリピート回数分ガシガシとスピーディーに結合されていく進捗が流れていきます。
短い動画なら一瞬ウィンドウが現れてすぐ閉じるくらい爆速ですにゃ~
▼ウィンドウが閉じたら結合処理完了です。指定した出力先に指定したファイル名で結合された動画が確認できればOKです!
参考までに結合処理にかかる時間は、約20分の動画を35回リピート結合させて約10分でした。めちゃくちゃ早いです!!
パソコンへの負荷も少ないのがまた良いですにゃ~
▼サクッとすぐに使えるように下記より.pyファイルのダウンロードも可能です(zip圧縮しています)。
→動画を再エンコードせずループ結合させる.pyファイルをダウンロード
おわりに
本記事がどなたかの参考になれば幸いです。
今回は以上となります。
最後まで読んでいただきましてありがとうございました!
それではまた〜✧٩(ˊωˋ*)و✧
コメント