Windows 使用ffmpeg来提取视频片段

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. 脚本说明:

  1. your_video_file.mp4 替换为你的实际视频文件名。
  2. 输出文件将保存在 output_segments 文件夹中,脚本会自动创建该文件夹。
  3. segment_duration=3 是每个片段的时长,单位是秒。
  4. interval=300 是每隔 5 分钟提取一次的间隔,单位是秒
  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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值