@CroSSer23

Как разрезать видео с нужной длительностью и нужными интервалами (есть решение, но не оптимизировано)?

Приветствую!
Есть задача, делать нарезки видео на фрагменты с нужным интервалом
Я написал скрипт на python он работает, но есть проблема. Чем дальше скрипт продвигается по видео, тем медленее он нарезает фрагменты, бывает 1 фрагмент обрабатывает 7-10 минут.
Подскажите пожалуйста с решением проблемы)
ЧатГПТ не решает))

import tkinter as tk
from tkinter import filedialog
import subprocess
import math

root = tk.Tk()
root.title("Video to segments")

def select_video():
    global video_path
    video_path = filedialog.askopenfilename()
    video_path_label.config(text=video_path)

def select_output():
    global output_path 
    output_path = filedialog.askdirectory()
    output_path_label.config(text=output_path)

def split_video():
    global video_path, output_path
    if not video_path or not output_path:
        return
    
    duration = int(float(subprocess.check_output(['ffprobe', '-v', 'error', '-show_entries', 'format=duration', '-of', 'default=noprint_wrappers=1:nokey=1', video_path]).decode('utf-8').strip()))
    segment_duration = int(segment_entry.get())
    step_size = int(step_entry.get())
    
    num_segments = math.ceil(duration / step_size)
    segment_count_label.config(text=f"Number of segments: {num_segments}")
    
    start = 0
    end = segment_duration
    for i in range(num_segments):
        start_mins = start // 60
        start_secs = start % 60
        end_mins = end // 60 
        end_secs = end % 60
        
        start_timecode = f"{start_mins:02d}_{start_secs:02d}"
        end_timecode = f"{end_mins:02d}_{end_secs:02d}"
        
        file_name = f"segment_{start_timecode}-{end_timecode}.mp4"
        
        subprocess.run(['ffmpeg', '-i', video_path, '-preset', 'ultrafast', '-ss', str(start), '-to', str(end),'-threads', '4', output_path + '/' + file_name])
        
        start = end + step_size
        end = min(start + segment_duration, duration)
        
    
video_path = ''
output_path = ''

video_path_label = tk.Label(root, text='Video not selected')
video_path_label.pack()

video_button = tk.Button(root, text="Select video", command=select_video) 
video_button.pack()

output_path_label = tk.Label(root, text='Output path not selected')
output_path_label.pack()

output_button = tk.Button(root, text="Select output path", command=select_output)
output_button.pack()

segment_label = tk.Label(root, text='Segment duration (seconds)')
segment_label.pack()

segment_entry = tk.Entry(root)
segment_entry.insert(0, '3')
segment_entry.pack()

step_label = tk.Label(root, text='Step (seconds)')  
step_label.pack()

step_entry = tk.Entry(root)
step_entry.insert(0, '15')
step_entry.pack()

split_button = tk.Button(root, text="Split", command=split_video)
split_button.pack()

segment_count_label = tk.Label(root, text='')
segment_count_label.pack()

root.mainloop()

654bfb1711938440284944.png

В основном это нарезки по 1-2 часа.
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
hint000
@hint000
у админа три руки
Вам же не нужно пережимать видео, достаточно тупо копировать куски?
Попробуйте здесь
subprocess.run(['ffmpeg', '-i', video_path, '-preset', 'ultrafast', '-ss', str(start), '-to', str(end),'-threads', '4', output_path + '/' + file_name])

заменить '-preset', 'ultrafast'
на '-c', 'copy'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы