はじめに
がちもとさんアドベントカレンダー1日目の記事です。
今日は、長い動画を25MBごとに分割するプログラムを作成しました。
開発環境
- Windows 11 PC
- Python 3.11
導入
ライブラリのインストール
pip install moviepy
プログラムの作成
from moviepy.editor import VideoFileClip
from moviepy.editor import concatenate_videoclips
import os
import tempfile
def split_video(file_path, max_size_mb=25):
clip = VideoFileClip(file_path)
total_duration = clip.duration
max_size_bytes = max_size_mb * 1024 * 1024
current_clips = []
current_size = 0
part = 1
base_name, ext = os.path.splitext(os.path.basename(file_path))
for i in range(0, int(total_duration), 60): # 60秒ごとにループ
subclip = clip.subclip(i, min(i + 60, total_duration))
# 一時ファイルのパスを生成
temp_fd, temp_filename = tempfile.mkstemp(suffix='.mp4')
subclip.write_videofile(temp_filename, codec="libx264")
clip_size = os.path.getsize(temp_filename)
print(current_size / 1024 / 1024)
if current_size + clip_size > max_size_bytes:
final_clip = concatenate_videoclips(current_clips)
final_clip.write_videofile(f"{base_name}_{part:06d}{ext}", codec="libx264")
part += 1
current_clips = []
current_size = 0
current_clips.append(subclip)
current_size += clip_size
# 一時ファイルを削除
os.close(temp_fd)
os.remove(temp_filename)
# 最後のパートを保存
if current_clips:
final_clip = concatenate_videoclips(current_clips)
final_clip.write_videofile(f"{base_name}_{part:06d}{ext}", codec="libx264")
# 使用例
split_video("example.mp4")
このスクリプトは、動画ファイルを指定した最大サイズに分割するために使用されます。手順は以下の通りです:
1.指定された動画ファイルを読み込み、その全体の長さを取得します。
2.60秒ごとに動画を区切り、各セグメントを一時ファイルに保存します。
3.これらのセグメントのサイズをチェックし、合計サイズが指定された最大サイズ(デフォルトは25MB)に達するまでセグメントを追加します。
4.最大サイズに達したら、これまでのセグメントを結合して1つの動画ファイルとして保存し、次の部分に進みます。
5.全てのセグメントが処理されるまでこのプロセスを繰り返します。
6.最後のセグメントも同様に結合して保存します。
使用例では、"example.mp4"というファイルをこのスクリプトで分割しています。このスクリプトは、動画の長さに関わらず、任意の動画ファイルを指定したサイズに分割することが可能です。
実行
example.mp4は310MBあるのですが、25MB以内の9個のファイルに分割できました。
他にもっといい方法があれば教えてください!
お疲れさまでした。