Newer
Older
Demo-Maker / crop.py
import argparse

from moviepy.editor import VideoFileClip


def crop_video_time(input_path, output_path, start_time, end_time):
    """
    指定された時間範囲で動画をクロップする関数

    Parameters:
    -----------
    input_path : str
        入力動画のパス
    output_path : str
        出力動画のパス
    start_time : float
        開始時間(秒)
    end_time : float
        終了時間(秒)
    """
    try:
        # 動画を読み込む
        video = VideoFileClip(input_path)

        # 動画の長さをチェック
        if end_time > video.duration:
            print(
                f"警告: 指定された終了時間({end_time}秒)が動画の長さ({video.duration}秒)を超えています"
            )
            end_time = video.duration

        if start_time < 0:
            print("警告: 開始時間は0秒以上である必要があります")
            start_time = 0

        if start_time >= end_time:
            raise ValueError("開始時間は終了時間より小さい必要があります")

        # 指定された時間範囲で動画をクロップ
        cropped_video = video.subclip(start_time, end_time)

        # 動画を保存
        cropped_video.write_videofile(output_path, codec="libx264", audio_codec="aac")

        # リソースを解放
        video.close()
        cropped_video.close()

        print(f"動画のクロップが完了しました: {output_path}")

    except Exception as e:
        print(f"エラーが発生しました: {str(e)}")
        raise


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="動画の時間的クロップを行うスクリプト")
    parser.add_argument("input_path", help="入力動画のパス")
    parser.add_argument("output_path", help="出力動画のパス")
    parser.add_argument("start_time", type=float, help="開始時間(秒)")
    parser.add_argument("end_time", type=float, help="終了時間(秒)")

    args = parser.parse_args()

    crop_video_time(args.input_path, args.output_path, args.start_time, args.end_time)