【Python】単に動画を指定範囲で切り取る方法

今回はPythonを使って、動画ファイルを簡単に指定時間で切り取る方法を紹介します。
GUIで動画ファイルを選択でき、開始時間と終了時間を入力するだけで処理できる便利なツールです。FFmpegを内部で利用しています。

時間文字列を秒に変換する関数

この関数で、秒や「mm:ss」の形式を秒数に変換します。

def parse_time(time_str):
    """
    入力された時間文字列(秒数, mm:ss, h:mm:ss)を秒に変換す
    """
    time_str = time_str.strip()
    parts = time_str.split(":")

    try:
        if len(parts) == 3:
            h, m, s = parts
            return int(h) * 3600 + int(m) * 60 + float(s)
        elif len(parts) == 2:
            m, s = parts
            return int(m) * 60 + float(s)
        elif len(parts) == 1:
            return float(parts[0])
        else:
            raise ValueError
    except ValueError:
        raise ValueError("時間の形式が正しくありません。例: 123.4 または 12:34 または 1:23:45")

ファイル選択と入力処理

ターミナル(GUI)で動画ファイルを選択肢、選択されなければ処理を終了します

root = tk.Tk()
root.withdraw()

input_path = filedialog.askopenfilename(
    title="動画ファイルを選択してください",
    filetypes=[("動画ファイル", "*.mp4 *.mov *.avi *.mkv *.flv *.wmv"), ("すべてのファイル", "*.*")]
)
start = parse_time(input("開始時間(秒 または mm:ss または h:mm:ss): "))
end = parse_time(input("終了時間(秒 または mm:ss または h:mm:ss): "))

FFmpegコマンドで動画を切り取る

command = [
    "ffmpeg",
    "-ss", str(start),
    "-i", input_path,
    "-t", str(duration),
    "-c", "copy",
    output_path
]

動画切り取りの実行

subprocess.run(command, check=True)

まとめ

このPythonスクリプトを使えば、初心者でも簡単に動画のトリミングが可能です。
ポイントは:

  • parse_time()で柔軟に時間指定できる
  • tkinterでGUIファイル選択
  • ffmpegを使って高速・画質劣化なしで切り取れる

ぜひ自分の動画編集ワークフローに組み込んでみてください。

プログラム全体

import subprocess
import os
import tkinter as tk
from tkinter import filedialog

def parse_time(time_str):
    """
    入力された時間文字列(秒数, mm:ss, h:mm:ss)を秒に変換す
    """
    time_str = time_str.strip()
    parts = time_str.split(":")

    try:
        if len(parts) == 3:
            h, m, s = parts
            return int(h) * 3600 + int(m) * 60 + float(s)
        elif len(parts) == 2:
            m, s = parts
            return int(m) * 60 + float(s)
        elif len(parts) == 1:
            return float(parts[0])
        else:
            raise ValueError
    except ValueError:
        raise ValueError("時間の形式が正しくありません。例: 123.4 または 12:34 または 1:23:45")

def main():
    root = tk.Tk()
    root.withdraw()

    input_path = filedialog.askopenfilename(
        title="動画ファイルを選択してください",
        filetypes=[("動画ファイル", "*.mp4 *.mov *.avi *.mkv *.flv *.wmv"), ("すべてのファイル", "*.*")]
    )

    if not input_path:
        print("ファイルが選択されませんでした。")
        return

    if not os.path.exists(input_path):
        print("指定された動画ファイルが見つかりません。")
        return

    try:
        start = parse_time(input("開始時間(秒 または mm:ss または h:mm:ss): "))
        end = parse_time(input("終了時間(秒 または mm:ss または h:mm:ss): "))
    except ValueError as e:
        print(f"時間の入力に誤りがあります: {e}")
        return

    if start < 0 or end <= start:
        print("時間指定が正しくありません。")
        return

    duration = end - start

    base, ext = os.path.splitext(input_path)
    output_path = f"{base}_output{ext}"

    command = [
        "ffmpeg",
        "-ss", str(start),
        "-i", input_path,
        "-t", str(duration),
        "-c", "copy",
        output_path
    ]

    print("動画を切り取り中...")

    try:
        subprocess.run(command, check=True)
        print(f"完了!ファイルを保存しました: {output_path}")
    except subprocess.CalledProcessError as e:
        print("ffmpeg 実行中にエラーが発生しました。")
        print(e)

if __name__ == "__main__":
    main()import subprocess
import os
import tkinter as tk
from tkinter import filedialog

def parse_time(time_str):
    """
    入力された時間文字列(秒数, mm:ss, h:mm:ss)を秒に変換す
    """
    time_str = time_str.strip()
    parts = time_str.split(":")

    try:
        if len(parts) == 3:
            h, m, s = parts
            return int(h) * 3600 + int(m) * 60 + float(s)
        elif len(parts) == 2:
            m, s = parts
            return int(m) * 60 + float(s)
        elif len(parts) == 1:
            return float(parts[0])
        else:
            raise ValueError
    except ValueError:
        raise ValueError("時間の形式が正しくありません。例: 123.4 または 12:34 または 1:23:45")

def main():
    root = tk.Tk()
    root.withdraw()

    input_path = filedialog.askopenfilename(
        title="動画ファイルを選択してください",
        filetypes=[("動画ファイル", "*.mp4 *.mov *.avi *.mkv *.flv *.wmv"), ("すべてのファイル", "*.*")]
    )

    if not input_path:
        print("ファイルが選択されませんでした。")
        return

    if not os.path.exists(input_path):
        print("指定された動画ファイルが見つかりません。")
        return

    try:
        start = parse_time(input("開始時間(秒 または mm:ss または h:mm:ss): "))
        end = parse_time(input("終了時間(秒 または mm:ss または h:mm:ss): "))
    except ValueError as e:
        print(f"時間の入力に誤りがあります: {e}")
        return

    if start < 0 or end <= start:
        print("時間指定が正しくありません。")
        return

    duration = end - start

    base, ext = os.path.splitext(input_path)
    output_path = f"{base}_output{ext}"

    command = [
        "ffmpeg",
        "-ss", str(start),
        "-i", input_path,
        "-t", str(duration),
        "-c", "copy",
        output_path
    ]

    print("動画を切り取り中...")

    try:
        subprocess.run(command, check=True)
        print(f"完了!ファイルを保存しました: {output_path}")
    except subprocess.CalledProcessError as e:
        print("ffmpeg 実行中にエラーが発生しました。")
        print(e)

if __name__ == "__main__":
    main()import subprocess
import os
import tkinter as tk
from tkinter import filedialog

def parse_time(time_str):
    """
    入力された時間文字列(秒数, mm:ss, h:mm:ss)を秒に変換す
    """
    time_str = time_str.strip()
    parts = time_str.split(":")

    try:
        if len(parts) == 3:
            h, m, s = parts
            return int(h) * 3600 + int(m) * 60 + float(s)
        elif len(parts) == 2:
            m, s = parts
            return int(m) * 60 + float(s)
        elif len(parts) == 1:
            return float(parts[0])
        else:
            raise ValueError
    except ValueError:
        raise ValueError("時間の形式が正しくありません。例: 123.4 または 12:34 または 1:23:45")

def main():
    root = tk.Tk()
    root.withdraw()

    input_path = filedialog.askopenfilename(
        title="動画ファイルを選択してください",
        filetypes=[("動画ファイル", "*.mp4 *.mov *.avi *.mkv *.flv *.wmv"), ("すべてのファイル", "*.*")]
    )

    if not input_path:
        print("ファイルが選択されませんでした。")
        return

    if not os.path.exists(input_path):
        print("指定された動画ファイルが見つかりません。")
        return

    try:
        start = parse_time(input("開始時間(秒 または mm:ss または h:mm:ss): "))
        end = parse_time(input("終了時間(秒 または mm:ss または h:mm:ss): "))
    except ValueError as e:
        print(f"時間の入力に誤りがあります: {e}")
        return

    if start < 0 or end <= start:
        print("時間指定が正しくありません。")
        return

    duration = end - start

    base, ext = os.path.splitext(input_path)
    output_path = f"{base}_output{ext}"

    command = [
        "ffmpeg",
        "-ss", str(start),
        "-i", input_path,
        "-t", str(duration),
        "-c", "copy",
        output_path
    ]

    print("動画を切り取り中...")

    try:
        subprocess.run(command, check=True)
        print(f"完了!ファイルを保存しました: {output_path}")
    except subprocess.CalledProcessError as e:
        print("ffmpeg 実行中にエラーが発生しました。")
        print(e)

if __name__ == "__main__":
    main()

コメント

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