不好意思,上一个代码运行的时候没有进度条我们无法对运行的时候有一个直观的感受,我们可以添加一个进度条
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=process_video)
process_button.pack(pady=10)
# 结果标签
result_label = tk.Label(root, text="")
result_label.pack(pady=10)
root.mainloop()
感谢大家