フォルダ内にある複数の動画ファイルを、指定した時間カットして結合する方法を紹介します。
本記事では 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. 動画のカットと結合の流れ
- フォルダ内の動画を取得
- 動画の前半・後半をカット
- カット済みの動画を一時フォルダに保存
- カットした動画を結合
- 指定のフォルダに保存
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_time
や end_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.mp4
→ video_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をマウントすれば、動画のアップロード・ダウンロード不要で処理可能
このスクリプトを利用することで、大量の動画を効率的に処理できます。