今回は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()
コメント