【動画編集を自動化!】Pythonスクリプトで複数の動画をまとめて簡単加工

目次

【動画編集を自動化!】Pythonスクリプトで複数の動画をまとめて簡単加工

動画編集、時間かかって大変じゃありませんか?

「たくさんの動画のサイズを統一したい」「特定の箇所をトリミングしたい」「画質を調整したい」

そんな悩みを解決してくれるのが、今回ご紹介するPythonスクリプトです! このスクリプトを使えば、複数の動画ファイルに対して、指定した処理を自動でまとめて行うことができます。

こんな悩みを解決!

  • 大量の動画のアスペクト比を統一したい
  • SNSにアップロードするために動画サイズを調整したい
  • 動画の一部分を切り出して別の動画として保存したい
  • 基本的な画質調整をまとめて行いたい

今回ご紹介するPythonスクリプトの機能

この記事でご紹介するPythonスクリプトは、以下の処理を自動で行います。

  1. 幅を1080pxにスケール(アスペクト比は維持)
  2. さらに全体を120%に拡大
  3. 1080×1920のサイズで中央からクロップ

例えば、様々なサイズの動画素材を、SNSの縦型動画フォーマット(1080×1920)に統一する際に非常に便利です。

必要なもの

このスクリプトを実行するには、以下のものが必要です。

  1. Pythonのインストール: まだインストールしていない場合は、Python公式サイト からダウンロードしてインストールしてください。
  2. FFmpegのインストール: 動画処理の核となるツールです。以下の手順でインストールしてください。
    • FFmpeg公式サイト からWindows用の実行ファイルをダウンロードします。(他のOSの場合は公式サイトの手順に従ってください)
    • ダウンロードしたzipファイルを展開し、C:\ffmpeg などの分かりやすい場所に保存します。
    • 重要: 展開したフォルダ内の bin フォルダ (C:\ffmpeg\bin) をシステムの環境変数Pathに追加します。これにより、コマンドプロンプトから ffmpeg コマンドが実行できるようになります。
    • コマンドプロンプトを開き ffmpeg -version と入力して、FFmpegが正しくインストールされているか確認してください。

Pythonスクリプトの紹介

以下のPythonコードを、.py という拡張子のファイル(例: process_videos.py)として保存してください。

Python

import subprocess
import os
import glob

def process_video_with_ffmpeg(input_file_path, output_folder_path):
    """
    指定された動画ファイルに対してFFmpeg処理を適用します。

    1. 幅を1080pxにスケール(アスペクト比維持)
    2. さらに全体を120%に拡大
    3. 1080x1920で中央からクロップ

    :param input_file_path: 入力動画ファイルのフルパス
    :param output_folder_path: 出力先フォルダのパス
    :return: 成功した場合はTrue、失敗した場合はFalse
    """
    if not os.path.exists(input_file_path):
        print(f"エラー: 入力ファイル '{input_file_path}' が見つかりません。")
        return False

    if not os.path.exists(output_folder_path):
        try:
            os.makedirs(output_folder_path)
            print(f"出力フォルダを作成しました: {output_folder_path}")
        except OSError as e:
            print(f"エラー: 出力フォルダの作成に失敗しました - {output_folder_path}\n{e}")
            return False

    file_name = os.path.basename(input_file_path)
    name_part, ext_part = os.path.splitext(file_name)
    output_file_name = f"{name_part}_processed{ext_part}"
    output_file_path = os.path.join(output_folder_path, output_file_name)

    # FFmpegコマンドの構築
    # フィルターチェーン:
    # 1. scale=1080:-2 : 幅を1080pxに、高さはアスペクト比を維持してスケーリング
    #    (入力が720x1080なら、1080x1620になる)
    # 2. scale=iw*1.2:ih*1.2 : 現在の解像度(iw, ih)を1.2倍に拡大
    #    (1080x1620なら、1296x1944になる)
    # 3. crop=1080:1920:(iw-1080)/2:(ih-1920)/2 : 1080x1920で中央からクロップ
    #    (iw, ihはscale=iw*1.2:ih*1.2適用後の解像度)
    #    cropのx,y指定で (iw-ow)/2, (ih-oh)/2 を使うと中央クロップになる
    ffmpeg_command = [
        'ffmpeg',
        '-i', input_file_path,
        '-vf', 'scale=1080:-2,scale=iw*1.2:ih*1.2,crop=1080:1920:(iw-1080)/2:(ih-1920)/2',
        '-c:v', 'libx264',  # ビデオコーデック (必要に応じて変更)
        '-preset', 'medium', # エンコード速度と品質のバランス (ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow)
        '-crf', '23',       # 品質 (0-51, 低いほど高品質、18-28が一般的)
        '-c:a', 'aac',      # 音声コーデック (copyだとエラーになる場合があるのでaacを指定)
        '-b:a', '192k',      # 音声ビットレート
        '-y',               # 出力ファイルを上書き
        output_file_path
    ]
    # scaleフィルターで高さを指定する際、-1ではなく-2を使うことを推奨する場合がある(偶数値保証のため)

    print(f"\n処理中のファイル: {input_file_path}")
    print(f"実行するコマンド: {' '.join(ffmpeg_command)}")

    try:
        process = subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdout, stderr = process.communicate()

        if process.returncode == 0:
            print(f"処理成功: {output_file_path}")
            return True
        else:
            print(f"エラー: FFmpegコマンドの実行に失敗しました - {input_file_path}")
            print(f"FFmpeg stdout:\n{stdout.decode('utf-8', errors='ignore')}")
            print(f"FFmpeg stderr:\n{stderr.decode('utf-8', errors='ignore')}")
            return False
    except FileNotFoundError:
        print("エラー: FFmpegがインストールされていないか、パスが通っていません。")
        return False
    except Exception as e:
        print(f"予期せぬエラーが発生しました ({input_file_path}): {e}")
        return False

if __name__ == "__main__":
    input_video_folder = r"ここに処理したい動画が入ったフォルダのパスを入力してください"
    output_video_folder = r"ここに処理後の動画を出力したいフォルダのパスを入力してください"

    # 処理対象の動画ファイルの拡張子 (必要に応じて追加・変更)
    supported_extensions = ['*.mp4', '*.mov', '*.avi', '*.mkv', '*.webm', '*.flv']

    if not os.path.isdir(input_video_folder):
        print(f"エラー: 入力フォルダが見つかりません - {input_video_folder}")
        exit()

    files_to_process = []
    for ext in supported_extensions:
        files_to_process.extend(glob.glob(os.path.join(input_video_folder, ext)))

    if not files_to_process:
        print(f"入力フォルダ '{input_video_folder}' に処理対象の動画ファイルが見つかりませんでした。")
        exit()

    print(f"{len(files_to_process)} 個の動画ファイルを処理します...")

    success_count = 0
    failure_count = 0

    for video_file in files_to_process:
        if process_video_with_ffmpeg(video_file, output_video_folder):
            success_count += 1
        else:
            failure_count += 1
            # 1つのファイルでエラーが発生しても、次のファイルの処理を試みる

    print("\n--- 全ての処理が完了しました ---")
    print(f"成功: {success_count} ファイル")
    print(f"失敗: {failure_count} ファイル")

スクリプトの使い方

  1. 上記のPythonコードを .py ファイルとして保存します(例: process_videos.py)。
  2. スクリプト内の input_video_folder の行を、処理したい動画ファイルが入ったフォルダのフルパスに書き換えます。
  3. スクリプト内の output_video_folder の行を、処理後の動画を出力したいフォルダのフルパスに書き換えます。
  4. コマンドプロンプトを開き、スクリプトを保存したフォルダに移動します。
  5. 以下のコマンドを実行します。 Bashpython process_videos.py スクリプトが実行され、指定したフォルダ内の動画ファイルが順に処理されます。処理の進捗やエラーメッセージがコマンドプロンプトに表示されます。

注意点

  • FFmpegのインストールとパス設定 が正しく行われていないと、スクリプトはエラーで停止します。
  • 処理する動画ファイルの数やサイズによっては、処理に時間がかかる場合があります。
  • スクリプト内のFFmpegのコマンドオプションは、必要に応じて変更できます。例えば、画質やエンコード速度などを調整したい場合は、-crf-preset の値を変更してみてください。
  • スクリプトを実行する前に、必ず重要な動画ファイルのバックアップを取ることを強く推奨します。

まとめ

このPythonスクリプトを使えば、煩雑な動画のサイズ調整作業から解放され、よりクリエイティブな作業に集中できるはずです。ぜひ一度試してみてください!

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

Instagramで最新情報を発信中

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

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

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