废话不多说了,直接上代码
import tkinter as tk
from tkinter import filedialog, ttk
import cv2
import os
def change_video_speed(input_video_path, output_video_path, speed=1, progress_callback=None):
# 打开视频文件
video = cv2.VideoCapture(input_video_path)
if not video.isOpened():
print("Error opening video file")
return
# 获取视频的基本属性
fps = video.get(cv2.CAP_PROP_FPS)
frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 新的帧率为原帧率乘以速度因子
new_fps = fps * speed
# 创建一个 VideoWriter 对象来写入新的视频
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 也可以选择其他编码格式,例如 'XVID'
out = cv2.VideoWriter(output_video_path, fourcc, new_fps, (width, height))
processed_frames = 0
while video.isOpened():
ret, frame = video.read()
if not ret:
break
out.write(frame)
processed_frames += 1
if progress_callback:
progress_callback(processed_frames / frame_count * 100)
# 完成后释放视频对象
video.release()
out.release()
def process_video():
input_path = input_entry.get()
output_path = output_entry.get()
speed = float(speed_entry.get())
if not input_path or not output_path:
result_label.config(text="请选择输入和输出文件!")
else:
try:
progress_bar['maximum'] = 100
progress_bar.start() # 开始进度条动画
change_video_speed(input_path, output_path, speed, update_progress)
progress_bar.stop() # 停止进度条动画
progress_bar['value'] = 0
result_label.config(text="视频处理完成!")
# 清空输入框
input_entry.delete(0, tk.END)
output_entry.delete(0, tk.END)
except Exception as e:
result_label.config(text=f"处理失败:{e}")
def browse_input():
filepath = filedialog.askopenfilename(filetypes=[("Video files", "*.mp4 *.avi")])
input_entry.delete(0, tk.END)
input_entry.insert(0, filepath)
def browse_output():
filepath = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("Video files", "*.mp4 *.avi")])
output_entry.delete(0, tk.END)
output_entry.insert(0, filepath)
def update_progress(progress):
progress_bar['value'] = progress
root.update_idletasks()
# 创建主窗口
root = tk.Tk()
root.title("视频处理工具")
# 输入文件路径
tk.Label(root, text="输入文件:").pack(pady=5)
input_entry = tk.Entry(root, width=50)
input_entry.pack(pady=5)
browse_input_button = tk.Button(root, text="浏览", command=browse_input)
browse_input_button.pack(pady=5)
# 输出文件路径
tk.Label(root, text="输出文件:").pack(pady=5)
output_entry = tk.Entry(root, width=50)
output_entry.pack(pady=5)
browse_output_button = tk.Button(root, text="浏览", command=browse_output)
browse_output_button.pack(pady=5)
# 设置播放速度
tk.Label(root, text="播放速度 (倍速):").pack(pady=5)
speed_entry = tk.Entry(root, width=10)
speed_entry.pack(pady=5)
speed_entry.insert(0, "2")
# 进度条
progress_bar = ttk.Progressbar(root, orient="horizontal", length=300, mode='determinate')
progress_bar.pack(pady=10)
# 处理按钮
process_button = tk.Button(root, text="处理视频", command=lambda: root.after_idle(process_video))
process_button.pack(pady=10)
# 结果标签
result_label = tk.Label(root, text="")
result_label.pack(pady=10)
root.mainloop()
1.步骤如下
下面是将你的 Python 脚本 lios.py 打包成一个独立的 Windows 可执行文件的步骤,使用 PyInstaller 工具。以下是详细的步骤
使用 PyInstaller 将 Python 脚本打包成 Windows 可执行文件
安装 PyInstaller
首先,确保你已经安装了 PyInstaller
。如果还没有安装,可以使用 pip 安装:
pip install pyinstaller
安装完成后执行下一步
pyinstaller --onefile --noconsole lios.py
详细介绍运行什么意思
选项解释
--onefile
: 将所有依赖项打包进一个单独的可执行文件。--noconsole
: 在 Windows 上隐藏控制台窗口,适用于 GUI 应用程序。
打包后的文件位置
运行完上述命令后,你会在项目的根目录下看到几个新生成的目录:
build
: 包含构建过程中的临时文件。dist
: 包含最终生成的可执行文件。
你可以进入 dist
目录,找到生成的 lios.exe
文件,并运行它来测试应用程序是否正常工作。
然后大家可以测试运行一下
感谢大家观看