用python制作视频压缩工具
代码介绍
这是一个基于Tkinter库和FFmpeg的视频压缩工具,支持选择输入文件、选择输出路径,以及设置输出视频大小,通过新线程执行视频压缩操作并弹出消息框提示压缩完成。其中FFmpeg是第三方工具,自己下载一个然后把环境变量配好就可以使用。
具体功能包括:
- 选择输入文件:点击“选择视频”按钮弹出文件选择对话框,选择要压缩的视频文件。
- 选择输出路径:点击“选择路径”按钮弹出目录选择对话框,选择压缩后的视频要保存到的目录,同时会弹出一个对话框要求输入已处理好的视频的名字。
- 设置输出视频大小:在“压缩大小”文本框中输入要设置的视频大小,单位为kbps。
- 开始压缩:点击“开始压缩”按钮,会弹出两个消息框,第一个提示如果视频大小太大了,请耐心等待,第二个提示正在后台处理视频,处理完毕后会有相关的提示。
- 压缩完成提示:压缩完成后会弹出一个消息框提示压缩完成,并显示输出路径。
- 退出程序:点击“退出程序”按钮可以退出程序,同时会弹出一个确认对话框。
代码如下:
import threading
import tkinter as tk
from tkinter import filedialog, simpledialog
import subprocess
from tkinter import messagebox
import tkinter.font as tkFont
import os
class VideoCompressorApp:
def __init__(self, root):
self.root = root
self.root.title("欢迎使用力江视频压缩工具")
# 输入路径部分
self.input_label = tk.Label(root, text="输入路径:")
self.input_label.place(x=60, y=10)
self.input_path_var = tk.StringVar()
self.input_entry = tk.Entry(root, textvariable=self.input_path_var)
self.input_entry.place(x=130, y=10)
self.input_button = tk.Button(root, text="选择视频", command=self.choose_input_file, bg="#FFD45E")
# self.input_button.grid(row=0, column=2)
self.input_button.place(x=280, y=5)
# 输出路径部分
self.output_label = tk.Label(root, text="输出路径:")
self.output_label.place(x=60, y=50)
self.output_path_var = tk.StringVar()
self.output_entry = tk.Entry(root, textvariable=self.output_path_var)
self.output_entry.place(x=130, y=50)
self.output_button = tk.Button(root, text="选择路径", command=self.choose_output_path, bg="#FFCCBE")
# self.output_button.grid(row=1, column=2)
self.output_button.place(x=280, y=45)
# 压缩大小部分
self.bitrate_label = tk.Label(root, text="压缩大小(kbps):")
self.bitrate_label.place(x=7, y=90)
self.bitrate_var = tk.StringVar(value="200")
self.bitrate_entry = tk.Entry(root, textvariable=self.bitrate_var)
self.bitrate_entry.place(x=130, y=90)
# 开始压缩按钮
self.compress_button = tk.Button(root, text="开始压缩", command=self.start_compression, bg="#499C54")
self.compress_button.place(x=70, y=150)
# 退出程序按钮
self.quit_button = tk.Button(root, text="退出程序", command=root.quit, bg="#C75450")
self.quit_button.place(x=260, y=150)
myFont = tkFont.Font(size=10) # 创建一个字号为20的字体对象
self.text = tk.Label(root, text="***感谢你的使用!还需要别的程序设计的小伙伴请关注作者***", fg="blue", font=myFont)
self.text1 = tk.Label(root, text="***CSDN账号:https://blog.csdn.net/weixin_64801028***", fg="blue", font=myFont)
self.text.place(x=10, y=240)
self.text1.place(x=10, y=265)
def choose_input_file(self):
file_path = filedialog.askopenfilename(filetypes=[("Video files", "*.mp4")])
self.input_path_var.set(file_path)
def choose_output_path(self):
output_path = filedialog.askdirectory()
if output_path:
# 如果用户选择了目录,则弹出对话框让用户输入视频名字
video_name = simpledialog.askstring("已处理好的视频名字", "请输入视频名字:")
if video_name:
# 如果用户输入了视频名字,则将输出路径和视频名字拼接起来
output_file = os.path.join(output_path, f"{video_name}.mp4")
output_file = output_path + "/" + f"{video_name}.mp4"
self.output_path_var.set(output_file)
def start_compression(self):
input_file = self.input_path_var.get()
output_file = self.output_path_var.get()
target_bitrate = self.bitrate_var.get() + "k"
if not input_file or not output_file or not target_bitrate:
self.show_message_box("错误", "请选择文件并输入压缩大小!")
return
messagebox.showinfo('提示', '如果视频大小太大了,请耐心等待')
messagebox.showinfo('提示', '后台正在给你处理,当处理完毕以后会有相关的提示!')
# 创建新的线程来执行视频压缩
t = threading.Thread(target=self.compress_video, args=(input_file, output_file, target_bitrate))
t.start()
def compress_video(self, input_file, output_file, target_bitrate):
# 在这里执行视频压缩操作,并将压缩结果保存到输出文件中
ffmpeg_cmd = f'ffmpeg -i {input_file} -vcodec libx264 -b:v {target_bitrate} -acodec aac -b:a 128k {output_file}'
subprocess.call(ffmpeg_cmd, shell=True)
self.show_message_box("压缩完成", "视频压缩已完成!")
self.show_message_box("输出路径", f"输出路径:{output_file}")
def show_message_box(self, title, message):
# 弹出消息框,提示视频压缩完成
messagebox.showinfo(title, message)
def on_close():
if messagebox.askokcancel("退出程序", "确定要退出吗?"):
root.destroy()
if __name__ == "__main__":
root = tk.Tk()
root.geometry('400x300')
root.resizable(False, False)
root.protocol("WM_DELETE_WINDOW", on_close) # 指定点击关闭按钮时的回调函数
app = VideoCompressorApp(root)
root.mainloop()