import tkinter as tk
import cv2
import os
from tkinter import filedialog, messagebox, Label, Entry, Button
from moviepy.editor import VideoFileClip
def open_file():
file_path = filedialog.askopenfilename(filetypes=[("Video Files", "*.mp4")])
if file_path:
entry_file_path.delete(0, tk.END)
entry_file_path.insert(tk.END, file_path)
def split_video():
file_path = entry_file_path.get()
start_time = entry_start_time.get()
end_time = entry_end_time.get()
output_folder = "output"
if not os.path.exists(output_folder):
os.makedirs(output_folder)
if file_path and start_time and end_time:
try:
clip = VideoFileClip(file_path).subclip(start_time, end_time)
output_path = f"{output_folder}/output.mp4" # 设置输出文件路径
clip.write_videofile(output_path)
#lbl_status.config(text="分割完成!")
messagebox.showinfo("Info", "分割完成!")
except Exception as e:
#lbl_status.config(text=str(e))
messagebox.showerror("Error", text=str(e))
else:
#lbl_status.config(text="请填写影片的路径,剪辑开始及结束时间!")
messagebox.showerror("Error", "请填写影片的路径,剪辑开始及结束时间!")
def extract_frames():
file_path = entry_file_path.get()
start_time_str = entry_start_time.get()
end_time_str = entry_end_time.get()
if file_path and start_time_str and end_time_str:
start_time = sum(int(x) * 60 ** i for i, x in enumerate(reversed(start_time_str.split(":"))))
end_time = sum(int(x) * 60 ** i for i, x in enumerate(reversed(end_time_str.split(":"))))
video_capture = cv2.VideoCapture(file_path)
video_capture.set(cv2.CAP_PROP_FPS, 30)
output_folder = "output"
if not os.path.exists(output_folder):
os.makedirs(output_folder)
saved_frame_name = 0
while video_capture.isOpened():
frame_is_read, frame = video_capture.read()
if frame_is_read:
# 保存指定时间范围内的帧
current_time = video_capture.get(cv2.CAP_PROP_POS_MSEC) / 1000
if start_time <= current_time <= end_time:
cv2.imwrite(f"{output_folder}/frame{str(saved_frame_name)}.jpg", frame)
saved_frame_name += 1
elif current_time > end_time:
break
else:
print("Couldn't read the frame anymore!")
break
video_capture.release()
messagebox.showinfo("Info", "提取帧成功! 已经保存到output文件夹。")
else:
messagebox.showerror("Error", "请填写正确的影片路径,剪辑开始及结束时间!")
def start_execution():
if choice.get() == 1:
split_video()
elif choice.get() == 2:
extract_frames()
# 创建Tkinter窗口
root = tk.Tk()
root.geometry("350x200")
root.title("MP4视频帧提取及分割工具")
root.resizable(False, False)
# 打开文件按钮
btn_open_file = tk.Button(root, text="打开MP4文件", command=open_file)
btn_open_file.pack()
# 文件路径输入框
entry_file_path = tk.Entry(root)
entry_file_path.pack()
# 开始时间输入框
Label(root, text="开始时间--00:00(秒)").pack()
entry_start_time = Entry(root)
entry_start_time.pack()
# 结束时间输入框
Label(root, text="结束时间--00:00(秒)").pack()
entry_end_time = Entry(root)
entry_end_time.pack()
# 创建Radio Button的变量
choice = tk.IntVar()
# 创建一个 Frame 来放置 radio_button1 和 radio_button2
radio_frame = tk.Frame(root)
radio_frame.pack()
radio_button1 = tk.Radiobutton(radio_frame, text="分割MP4视频", variable=choice, value=1)
radio_button1.pack(side="left")
radio_button2 = tk.Radiobutton(radio_frame, text="提取MP4视频图片", variable=choice, value=2)
radio_button2.pack(side="left")
start_button = tk.Button(root, text="开始执行", command=start_execution)
start_button.pack()
# 状态标签
lbl_status = tk.Label(root)
lbl_status.pack()
# 运行窗口的主循环
root.mainloop()