「短い動画コンテンツを量産したいけど、編集に時間がかかって大変…」
そんな悩みを抱えているクリエイターの皆さん、Pythonとffmpegの力を借りれば、その悩みを解決できるかもしれません!今回は、フォルダ内の動画素材をランダムに選び、それぞれ3秒にカットして自動で繋ぎ合わせることで、無限にバリエーション豊かなショート動画を作成するプログラムをご紹介します。
Python
import os
import random
import subprocess
def process_videos(input_folder, output_folder, output_filename="short_video.mp4", clip_duration=3, final_duration=60, width=1080, height=1920):
"""
指定したフォルダ内の動画ファイルをランダムに選択し、指定の長さにカットして結合し、指定の解像度にリサイズします。
Args:
input_folder (str): 動画ファイルが格納されたフォルダのパス.
output_folder (str): 結合した動画を書き出すフォルダのパス.
output_filename (str, optional): 出力する結合動画のファイル名. Defaults to "short_video.mp4".
clip_duration (int, optional): 各動画から切り出す秒数. Defaults to 3.
final_duration (int, optional): 最終的な動画の秒数. Defaults to 60.
width (int, optional): 出力動画の幅. Defaults to 1080.
height (int, optional): 出力動画の高さ. Defaults to 1920.
"""
if not os.path.exists(input_folder):
print(f"入力フォルダ '{input_folder}' が存在しません。")
return
if not os.path.exists(output_folder):
os.makedirs(output_folder)
print(f"出力フォルダ '{output_folder}' を作成しました。")
video_files = [f for f in os.listdir(input_folder) if f.endswith(('.mp4', '.avi', '.mov', '.mkv'))]
num_clips = final_duration // clip_duration
if not video_files:
print(f"入力フォルダ '{input_folder}' に動画ファイルが見つかりませんでした。")
return
if len(video_files) < num_clips:
print(f"動画ファイルの数が{num_clips}個未満です。{len(video_files)}個の動画を使って可能な範囲で結合します。")
selected_videos = random.sample(video_files, len(video_files))
else:
selected_videos = random.sample(video_files, num_clips)
concat_list_path = os.path.join(output_folder, "concat_list.txt")
with open(concat_list_path, "w", encoding="utf-8") as f:
for i, video_file in enumerate(selected_videos):
input_path = os.path.join(input_folder, video_file)
output_clip_path = os.path.join(output_folder, f"temp_clip_{i}.mp4")
# ffmpegで3秒にカット
command = [
"ffmpeg",
"-i",
input_path,
"-ss",
"0",
"-t",
str(clip_duration),
"-vf",
f"scale={width}:{height}", # 縦型動画の解像度
"-c:v",
"libx264",
"-preset",
"ultrafast",
"-crf",
"23",
"-c:a",
"aac",
"-q:a",
"128k",
output_clip_path
]
try:
result = subprocess.run(command, check=True, capture_output=True)
f.write(f"file '{os.path.abspath(output_clip_path)}'\n")
except subprocess.CalledProcessError as e:
print(f"一時ファイル作成中にエラーが発生しました: {e.stderr.decode(encoding='cp932', errors='ignore')}")
for j in range(i):
temp_file = os.path.join(output_folder, f"temp_clip_{j}.mp4")
if os.path.exists(temp_file):
os.remove(temp_file)
if os.path.exists(concat_list_path):
os.remove(concat_list_path)
return
# ffmpegで結合
output_path = os.path.join(output_folder, output_filename)
concat_command = [
"ffmpeg",
"-f",
"concat",
"-safe",
"0",
"-i",
os.path.abspath(concat_list_path),
"-c",
"copy",
output_path
]
try:
result = subprocess.run(concat_command, check=False, capture_output=True)
if result.returncode != 0:
print(f"動画の結合中にエラーが発生しました (リターンコード: {result.returncode}):")
print(f"{result.stderr.decode(encoding='cp932', errors='ignore')}")
else:
print(f"'{output_path}' を作成しました。")
except Exception as e:
print(f"Pythonのエラー: {e}")
finally:
# 一時ファイルの削除
if os.path.exists(concat_list_path):
os.remove(concat_list_path)
for i in range(len(selected_videos)):
temp_clip_path = os.path.join(output_folder, f"temp_clip_{i}.mp4")
if os.path.exists(temp_clip_path):
os.remove(temp_clip_path)
if __name__ == "__main__":
input_folder = r"D:\python\動画制作自動化\ランダム結合\素材"
output_folder = r"D:\python\動画制作自動化\ランダム結合\書き出し先"
output_filename = "random_short_video.mp4" # 出力ファイル名をショート動画らしく変更
process_videos(input_folder, output_folder, output_filename, width=1080, height=1920) # 縦型解像度をデフォルトに
create_shorts.py
など適当な名前で保存します。D:\python\動画制作自動化\ランダム結合\素材
フォルダに格納します。D:\python\動画制作自動化\ランダム結合\書き出し先
を作成します。input_folder
と output_folder
のパスが、上記で作成したフォルダと一致しているか確認してください。python create_shorts.py
実行後、D:\python\動画制作自動化\ランダム結合\書き出し先
フォルダに random_short_video.mp4
という名前のショート動画が生成されます。clip_duration
や final_duration
の値を変更することで、ショート動画の長さを調整できます。width
と height
の値を調整することで、TikTokやYouTube Shortsなど、各プラットフォームに最適な解像度で出力できます。Pythonとffmpegを活用すれば、これまで時間のかかっていたショート動画の作成を自動化し、よりクリエイティブな活動に集中できます。ぜひこのプログラムを നിങ്ങളുടെショート動画制作フローに取り入れて、新たな可能性を切り開いてください!