27
2024
01

tk moviepy

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()


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。