1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

がちもとさんAdvent Calendar 2023

Day 1

長い動画を25MBごとに分割すーる(Python)

Posted at

はじめに

がちもとさんアドベントカレンダー1日目の記事です。
今日は、長い動画を25MBごとに分割するプログラムを作成しました。

開発環境

  • Windows 11 PC
  • Python 3.11

導入

ライブラリのインストール

pip install moviepy

プログラムの作成

split_video.py
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個のファイルに分割できました。
image.png

他にもっといい方法があれば教えてください!
お疲れさまでした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?