1. Windows 批处理脚本:
@echo off
setlocal enabledelayedexpansion
:: 定义变量
set "input_file=input_video.m2ts"
set "output_dir=output_segments"
set "segment_duration=3"
set "interval=300"
:: 创建输出文件夹
if not exist "%output_dir%" mkdir "%output_dir%"
:: 获取视频总时长
for /f "tokens=*" %%a in ('ffmpeg -i "%input_file%" 2^>^&1 ^| findstr /i "Duration"') do (
set "duration=%%a"
)
for /f "tokens=1-4 delims=:.," %%a in ("%duration:~10,11%") do (
set /a total_duration=%%a*3600 + %%b*60 + %%c
)
:: 初始化起始时间
set /a start_time=0
set /a segment_number=0
:: 循环提取片段
:extract_loop
if !start_time! lss !total_duration! (
set "hours=!start_time! / 3600"
set "minutes=(!start_time! %% 3600) / 60"
set "seconds=!start_time! %% 60"
set "formatted_time=!hours!:!minutes!:!seconds!"
set "output_file=%output_dir%\segment_!segment_number!.mp4"
:: ffmpeg -ss !start_time! -i "%input_file%" "!output_file!" -t 5
ffmpeg -ss !start_time! -i input_video.m2ts -t %segment_duration% -c copy "!output_file!"
set /a start_time+=%interval%
set /a segment_number+=1
goto extract_loop
)
echo 提取完成!
pause
1.1. 脚本说明:
- 将
your_video_file.mp4
替换为你的实际视频文件名。 - 输出文件将保存在
output_segments
文件夹中,脚本会自动创建该文件夹。 segment_duration=3
是每个片段的时长,单位是秒。interval=300
是每隔 5 分钟提取一次的间隔,单位是秒ffmpeg -ss
用来指定起始时间,-t
用来指定提取片段的持续时间,-c copy
保持原始视频质量。
2. 使用 python 创建图形界面
- 除了使用纯命令行版本,还可以使用 python 快速创建图形化界面,实现更简洁地操作
import tkinter as tk
from tkinter import filedialog, messagebox
import subprocess
import os
def select_files():
filepaths = filedialog.askopenfilenames(filetypes=[("Video files", "*.mp4;*.mov;*.avi;*.mkv")])
if filepaths:
input_files_var.set('; '.join(filepaths))
def start_extraction():
input_files = input_files_var.get().split('; ')
output_dir = output_dir_var.get()
interval = interval_var.get()
segment_duration = segment_duration_var.get()
if not input_files or input_files == ['']:
messagebox.showerror("Error", "Please select video files.")
return
if not os.path.exists(output_dir):
os.makedirs(output_dir)
try:
interval = int(interval)
segment_duration = int(segment_duration)
except ValueError:
messagebox.showerror("Error", "Interval and segment duration must be integers.")
return
for input_file in input_files:
# 获取视频总时长
result = subprocess.run(['ffmpeg', '-i', input_file], stderr=subprocess.PIPE, universal_newlines=True, encoding='utf-8')
duration_line = [x for x in result.stderr.split('\n') if "Duration" in x]
if not duration_line:
messagebox.showerror("Error", f"Failed to get video duration for {input_file}.")
continue
# 解析时长,并去掉可能存在的逗号
duration_parts = duration_line[0].split()[1].replace(',', '').split(':')
total_duration = int(duration_parts[0]) * 3600 + int(duration_parts[1]) * 60 + int(float(duration_parts[2]))
start_time = 0
segment_number = 0
while start_time < total_duration:
output_file = os.path.join(output_dir, f"{os.path.basename(input_file)}_segment_{segment_number:02d}.mp4")
# 调用FFmpeg提取片段
subprocess.run(['ffmpeg', '-ss', str(start_time), '-i', input_file, '-t', str(segment_duration), '-c', 'copy', output_file])
start_time += interval
segment_number += 1
messagebox.showinfo("Success", "Video segments have been extracted successfully!")
# 创建GUI界面
root = tk.Tk()
root.title("FFmpeg Video Segment Extractor")
# 输入文件选择
input_files_var = tk.StringVar()
tk.Label(root, text="Select Video Files:").grid(row=0, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=input_files_var, width=50).grid(row=0, column=1, padx=10, pady=5)
tk.Button(root, text="Browse", command=select_files).grid(row=0, column=2, padx=10, pady=5)
# 输出文件夹
output_dir_var = tk.StringVar(value="output_segments")
tk.Label(root, text="Output Folder:").grid(row=1, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=output_dir_var, width=50).grid(row=1, column=1, padx=10, pady=5)
# 设置时间间隔
interval_var = tk.StringVar(value="600") # 默认每隔10分钟
tk.Label(root, text="Interval (seconds):").grid(row=2, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=interval_var).grid(row=2, column=1, padx=10, pady=5)
# 设置片段持续时间
segment_duration_var = tk.StringVar(value="5") # 默认每个片段5秒
tk.Label(root, text="Segment Duration (seconds):").grid(row=3, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=segment_duration_var).grid(row=3, column=1, padx=10, pady=5)
# 开始提取按钮
tk.Button(root, text="Start Extraction", command=start_extraction).grid(row=4, column=0, columnspan=3, pady=20)
# 运行窗口
root.mainloop()