フォルダ内の動画をカットして結合する方法【Google Colab & FFmpeg & Python】

IT・プログラミング

フォルダ内にある複数の動画ファイルを、指定した時間カットして結合する方法を紹介します。
本記事では Google Colab を利用し、PythonとFFmpeg を組み合わせて処理を行います。

1. 実行環境

この手順は Google Colab 上で実行できます。
Colabを使用すると、特別な環境構築なしで FFmpegを実行できるLinux環境 を利用できます。

Google Drive上の動画を処理する場合は、事前にGoogle Driveをマウントする必要があります。

2. 必要なライブラリのインストール

Google Colabで FFmpegをインストール します。

!apt-get install -y ffmpeg

Google Driveを利用する場合は、次のコマンドでマウントします。

from google.colab import drive
drive.mount('/content/drive')

3. 動画のカットと結合の流れ

  1. フォルダ内の動画を取得
  2. 動画の前半・後半をカット
  3. カット済みの動画を一時フォルダに保存
  4. カットした動画を結合
  5. 指定のフォルダに保存

4. Pythonスクリプト(Google Colab対応)

以下のスクリプトを実行すると、フォルダ内の動画を一括でカットして結合できます。

import os
import subprocess

# Google Driveのフォルダパスを設定
input_folder = "/content/drive/MyDrive/Youtube/Input"  # 元の動画フォルダ
output_folder = "/content/drive/MyDrive/Youtube/Output"  # 結合後の動画保存先
temp_folder = "/content/drive/MyDrive/Youtube/Temp"  # 一時保存用フォルダ
output_file = os.path.join(output_folder, "merged_video.mp4")  # 最終出力ファイル

# フォルダ作成
os.makedirs(output_folder, exist_ok=True)
os.makedirs(temp_folder, exist_ok=True)

# フォルダ内の .mp4 ファイルを作成日時順に取得
mp4_files = [os.path.join(input_folder, f) for f in os.listdir(input_folder) if f.endswith(".mp4")]
mp4_files.sort(key=os.path.getctime)  # 作成日時順にソート(古い順)

# カット処理
temp_files = []
for input_path in mp4_files:
    filename = os.path.basename(input_path)
    temp_output_path = os.path.join(temp_folder, f"cut_{filename}")
    temp_files.append(temp_output_path)

    # 動画の長さを取得
    result = subprocess.run(
        ["ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", input_path],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True
    )
    duration = float(result.stdout.strip())  # 動画の長さ(秒)

    # カットする範囲を設定
    start_time = 15  # 前半カット(15秒)
    end_time = duration - 25  # 後半カット(25秒)

    # FFmpegでカット
    command = f'ffmpeg -i "{input_path}" -ss {start_time} -to {end_time} -c copy "{temp_output_path}"'
    os.system(command)
    print(f"カット完了: {temp_output_path}")

# 結合用のリストファイル作成
list_file = os.path.join(temp_folder, "file_list.txt")
with open(list_file, "w") as f:
    for file in temp_files:
        f.write(f"file '{file}'\n")

# FFmpegで結合(再エンコードなし)
merge_command = f'ffmpeg -f concat -safe 0 -i "{list_file}" -c copy "{output_file}"'
os.system(merge_command)

print(f"結合完了: {output_file}")

5. スクリプトのポイント

5.1 カット範囲の設定

start_time = 15  # 前半15秒をカット
end_time = duration - 25  # 後半25秒をカット

必要に応じて start_timeend_time の値を変更できます。

5.2 作成日時順に処理

mp4_files.sort(key=os.path.getctime)  # 作成日時順にソート

動画を 撮影順に処理するため、ファイル名ではなく作成日時でソート します。

5.3 再エンコードなしで結合

ffmpeg -f concat -safe 0 -i "file_list.txt" -c copy "merged_video.mp4"

-c copy を指定することで 画質を劣化させずに高速結合 できます。

5.4 Google Driveの利用

from google.colab import drive
drive.mount('/content/drive')

Google Driveを利用すれば、動画を手動でアップロードせずに処理できます。

6. 応用例

6.1 カット時間の変更

前半10秒・後半30秒をカットする場合

start_time = 10
end_time = duration - 30

6.2 ファイル名順で処理

ファイル名順(例: video_01.mp4video_02.mp4)に処理する場合

mp4_files.sort()

6.3 対応フォーマットを拡張

.mp4 以外の動画も処理する場合

video_formats = (".mp4", ".mov", ".avi")
mp4_files = [os.path.join(input_folder, f) for f in os.listdir(input_folder) if f.endswith(video_formats)]

7. まとめ

  • Google Colabを使えば、特別な環境構築なしでPythonとFFmpegを使った動画処理が可能
  • -c copy を指定することで、画質を劣化させずにカット&結合
  • 作成日時順にソートすることで、動画の撮影順を維持
  • Google Driveをマウントすれば、動画のアップロード・ダウンロード不要で処理可能

このスクリプトを利用することで、大量の動画を効率的に処理できます。

タイトルとURLをコピーしました