文件夹内视频裁剪水印,python工具,很实用哦!
1:运行相关环境
2:还有tkinter ttkthemes moviepy VideoFileClip pg等支持库的安装
支持的理论模式:
文件夹有N多视频,在统一位置有水印,进行定位裁剪去除水印。
def process_video(file_name, source_folder, output_folder):
full_path = os.path.join(source_folder, file_name)
clip = VideoFileClip(full_path)
cropped_clip = clip.crop(x1=0, y1=52, width=clip.w, height=clip.h - 52)
output_path = os.path.join(output_folder, file_name)
cropped_clip.write_videofile(output_path, codec='libx264', audio_codec='aac')
clip.close()
cropped_clip.close()
def clear_source_folder(source_folder, exclude_folder):
for file_name in os.listdir(source_folder):
file_path = os.path.join(source_folder, file_name)
if file_name.endswith(('.mp4', '.avi', '.mov')) and not file_path.startswith(exclude_folder):
os.remove(file_path)
def select_source_folder(root, source_entry):
source_dir = filedialog.askdirectory(title="选择源文件夹")
if source_dir:
source_entry.delete(0, tk.END)
source_entry.insert(0, source_dir)
def set_default_output_folder(source_folder):
output_folder = os.path.join(source_folder, 'output')
if not os.path.exists(output_folder):
os.makedirs(output_folder)
return output_folder
def start_processing(source_folder, root):
output_folder = set_default_output_folder(source_folder)
main(source_folder, output_folder)
messagebox.showinfo("提示", f"所有视频处理完成,原目录的视频已清空,处理的视频文件已存储至 {output_folder} 。")
clear_source_folder(source_folder, output_folder)
# 更新源文件夹标签状态(注:这里由于没有source_folder_label变量,已移除此行)
# source_folder_label.config(text=f"源文件夹: {source_folder} (已清空)")
# 输出信息
output_info_label.config(text=f"裁剪视频已存储到: {output_folder}\n\n右键复制路径")
这个实现的一个功能是导入一个文件夹,自动在文件下面创建一个output 输出裁剪完的视频。但是很多不懂的小伙伴嫌麻烦,还有编码问题,符号问题,环境搭建问题,更多的人更喜欢界面。
下面是界面的代码输出。
def main_gui():
global output_info_label, source_folder_entry
root = tk.Tk()
style = ThemedStyle(root)
root.title("三爷专用-文件夹内视频裁剪水印工具")
style.theme_use('arc')
source_folder_label = ttk.Label(root, text="源文件夹:")
source_folder_label.grid(row=0, column=0, padx=10, pady=10, sticky=tk.W)
source_folder_entry = ttk.Entry(root, width=50)
source_folder_entry.grid(row=0, column=1, padx=10, pady=10, sticky=tk.W+tk.E)
source_folder_entry.bind('<Button-1>', lambda event: select_source_folder(root, source_folder_entry))
ttk.Button(root, text="选择源文件夹", command=lambda: select_source_folder(root, source_folder_entry)).grid(row=0, column=2, padx=10, pady=10, sticky=tk.W+tk.E)
confirm_button = ttk.Button(root, text="确认并开始处理", command=lambda: start_processing(source_folder_entry.get(), root))
confirm_button.grid(row=1, column=0, columnspan=3, padx=10, pady=10, ipadx=20, ipady=10, sticky=tk.W+tk.E)
output_info_label = ttk.Label(root, text="", wraplength=500)
output_info_label.grid(row=2, column=0, columnspan=3, padx=10, pady=10, sticky=tk.W+tk.E)
root.mainloop()
pythondef main(source_folder, output_folder):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
video_files = [file_name for file_name in os.listdir(source_folder) if file_name.endswith(('.mp4', '.avi', '.mov'))]
futures = []
with ProcessPoolExecutor() as executor:
for file_name in video_files:
future = executor.submit(process_video, file_name, source_folder, output_folder)
futures.append(future)
# 等待所有future完成
for _ in as_completed(futures):
pass # 这里可以根据需要处理每个future的结果,例如捕获异常等
当然我也把界面简单的美化了一下: