2024-09-06 耶鲁沙冷
做影视采集站的找不到影视封面可以试试这个方法,利用ffmpeg提取视频第一帧保存成图片,这样就省去了找封面图的烦恼。
下面是用ffmpeg-python制作,带GUI,方便操作。输入源选择视频所在目录即可,并自动将文件夹的名称作为图片名称命名,并存放在该文件夹内,方便分类管理。
import tkinter as tk from tkinter import filedialog, messagebox import ffmpeg import os def extract_frame(input_path, output_path, timestamp='00:00:10', frame_count=1): """ 从视频中提取特定时间的帧。 :param input_path: 输入视频文件的路径。 :param output_path: 保存提取的图像的路径。 :param timestamp: 视频中提取帧的时间位置(默认为 '00:00:10')。 :param frame_count: 要提取的帧数(默认为1,类似于 ffmpeg 中的 -frames:v 1)。 """ try: ( ffmpeg .input(input_path, ss=timestamp) .output(output_path, vframes=frame_count) .run(overwrite_output=True) ) messagebox.showinfo("成功", "帧提取成功!") except Exception as e: messagebox.showerror("错误", f"帧提取失败:{e}") def select_input_file(): file_path = filedialog.askopenfilename() input_path.set(file_path) # 获取输入文件的父文件夹名并生成输出文件名 folder_name = os.path.basename(os.path.dirname(file_path)) output_file = os.path.join(os.path.dirname(file_path), f"{folder_name}.png") output_path.set(output_file) def run_extraction(): if not input_path.get() or not output_path.get(): messagebox.showwarning("警告", "请先选择输入和输出文件路径。") return timestamp = timestamp_entry.get() extract_frame(input_path.get(), output_path.get(), timestamp) # 创建主窗口 root = tk.Tk() root.title("视频帧提取器") # 定义输入输出路径和时间戳 input_path = tk.StringVar() output_path = tk.StringVar() # 创建并放置GUI组件 tk.Label(root, text="输入视频文件:").grid(row=0, column=0, padx=5, pady=5) tk.Entry(root, textvariable=input_path, width=50).grid(row=0, column=1, padx=5, pady=5) tk.Button(root, text="选择文件", command=select_input_file).grid(row=0, column=2, padx=5, pady=5) tk.Label(root, text="输出图像文件:").grid(row=1, column=0, padx=5, pady=5) tk.Entry(root, textvariable=output_path, width=50).grid(row=1, column=1, padx=5, pady=5) tk.Label(root, text="时间戳 (HH:MM:SS):").grid(row=2, column=0, padx=5, pady=5) timestamp_entry = tk.Entry(root) timestamp_entry.insert(0, "00:00:10") timestamp_entry.grid(row=2, column=1, padx=5, pady=5) tk.Button(root, text="提取帧", command=run_extraction).grid(row=3, column=1, padx=5, pady=20) # 运行主循环 root.mainloop()
原文链接:https://daomb.com/news/3739.html
本文版权:如无特别标注,本站文章均为原创。