【自動化】Pythonとffmpegで無限にショート動画を作成!

目次

【自動化】Pythonとffmpegで無限にショート動画を作成!

「短い動画コンテンツを量産したいけど、編集に時間がかかって大変…」

そんな悩みを抱えているクリエイターの皆さん、Pythonとffmpegの力を借りれば、その悩みを解決できるかもしれません!今回は、フォルダ内の動画素材をランダムに選び、それぞれ3秒にカットして自動で繋ぎ合わせることで、無限にバリエーション豊かなショート動画を作成するプログラムをご紹介します。

なぜショート動画の自動作成?

  • 効率化: 手作業での編集時間を大幅に削減し、コンテンツ作成のスピードを向上させます。
  • 量産: 多数のショート動画を短時間で作成できるため、様々なプラットフォームへの展開が容易になります。
  • ランダム性: 予期せぬ面白い組み合わせが生まれ、新たなコンテンツの可能性を発掘できます。
  • 実験: 様々な設定を試すことで、視聴者の反応を分析し、効果的なコンテンツ制作に繋げられます。

準備するもの

  • Python 3: スクリプトの実行に必須です。Python公式サイトからインストールしましょう。
  • ffmpeg: 動画処理の心臓部となるツールです。ffmpeg公式サイトからダウンロードし、インストールとパス設定を行ってください。
  • 動画素材: ショート動画の元となる動画ファイルを、特定のフォルダにまとめて用意します。

自動ショート動画作成Pythonスクリプト

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) # 縦型解像度をデフォルトに

ショート動画を自動生成する方法

  1. 上記のPythonスクリプトを create_shorts.py など適当な名前で保存します。
  2. 素材となる動画ファイルを、例えば D:\python\動画制作自動化\ランダム結合\素材 フォルダに格納します。
  3. 生成されたショート動画を保存するためのフォルダ D:\python\動画制作自動化\ランダム結合\書き出し先 を作成します。
  4. スクリプト内の input_folderoutput_folder のパスが、上記で作成したフォルダと一致しているか確認してください。
  5. ターミナルまたはコマンドプロンプトを開き、スクリプトを保存したディレクトリに移動し、以下のコマンドを実行します。 Bashpython create_shorts.py 実行後、D:\python\動画制作自動化\ランダム結合\書き出し先 フォルダに random_short_video.mp4 という名前のショート動画が生成されます。

ショート動画作成のヒント

  • 素材の選定: バラエティ豊かな素材を用意することで、より多様なショート動画が作成できます。
  • 尺の調整: clip_durationfinal_duration の値を変更することで、ショート動画の長さを調整できます。
  • 解像度: widthheight の値を調整することで、TikTokやYouTube Shortsなど、各プラットフォームに最適な解像度で出力できます。
  • 応用: BGMの自動追加や、トランジションの挿入など、さらに高度な自動化に挑戦してみるのも面白いでしょう。

まとめ

Pythonとffmpegを活用すれば、これまで時間のかかっていたショート動画の作成を自動化し、よりクリエイティブな活動に集中できます。ぜひこのプログラムを നിങ്ങളുടെショート動画制作フローに取り入れて、新たな可能性を切り開いてください!

注意点

  • ffmpegのインストールと環境設定は確実に行いましょう。
  • 動画ファイルの形式によっては、処理がうまくいかない場合があります。
  • 大量の動画を処理する場合は、ディスク容量に注意してください。

撮影に使用している機材【PR】

Instagramで最新情報を発信中

【無料】撮った写真でWEBページを作りませんか?

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
目次