Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 24.08.2022
Сообщений: 16

Ускорить процесс генерации видео moviepy

15.08.2024, 16:03. Показов 908. Ответов 0

Студворк — интернет-сервис помощи студентам
У меня есть код который генерирует видео, но скорость генерации очень маленькая, кто знает как можно ускорить генерацию видео(скорость генерации отображается в --its/s на скриншоте)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import os
import random
import moviepy.editor as mp
from moviepy.editor import TextClip, CompositeVideoClip
import whisper
import pysrt
from concurrent.futures import ThreadPoolExecutor
 
def split_audio_by_word(audio_file):
    word_timestamps = []
    model = whisper.load_model("small")
    result = model.transcribe(audio_file, language='ru')
 
    for segment in result['segments']:
        words = segment['text'].split()
        duration = (segment['end'] - segment['start']) / len(words)
        start_time = segment['start']
 
        for word in words:
            end_time = start_time + duration
            word_timestamps.append({
                'word': word,
                'start': start_time,
                'end': end_time
            })
            start_time = end_time
 
    return word_timestamps
 
def generate_word_subtitles(audio_file, output_srt):
    word_timestamps = split_audio_by_word(audio_file)
 
    with open(output_srt, 'w', encoding='utf-8') as f:
        for idx, word_timestamp in enumerate(word_timestamps):
            start = word_timestamp['start']
            end = word_timestamp['end']
            text = word_timestamp['word']
            f.write(f"{idx + 1}\n")
            f.write(f"{int(start//3600):02}:{int((start%3600)//60):02}:{start%60:.3f} --> {int(end//3600):02}:{int((end%3600)//60):02}:{end%60:.3f}\n")
            f.write(f"{text.strip()}\n\n")
 
def add_subtitles_from_file(video_clip, subtitle_file):
    subtitles = []
    subs = pysrt.open(subtitle_file)
 
    def to_seconds(t):
        return t.hours * 3600 + t.minutes * 60 + t.seconds + t.milliseconds / 1000
 
    for sub in subs:
        start_time = to_seconds(sub.start)
        end_time = to_seconds(sub.end)
        text = sub.text
 
        text_clip = TextClip(
            text,
            font='Arial-Bold',
            fontsize=90,
            color='white',
            stroke_color='black',
            stroke_width=3
        ).set_start(start_time).set_duration(end_time - start_time).set_position('center')
 
        subtitles.append(text_clip)
 
    return CompositeVideoClip([video_clip, *subtitles])
 
def ensure_audio_duration(audio_file, duration):
    audio_clip = mp.AudioFileClip(audio_file)
    if audio_clip.duration < duration:
        silence = mp.AudioClip(lambda t: [0], duration=duration - audio_clip.duration, fps=44100)
        audio_clip = mp.concatenate_audioclips([audio_clip, silence])
    return audio_clip
 
def create_final_video(folder1, folder2, folder3, folder4, output_dir, output_filename):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
 
    output_video = os.path.join(output_dir, output_filename)
 
    video_files1 = [os.path.join(folder1, f) for f in os.listdir(folder1) if f.endswith(('.mp4', '.avi', '.mov'))]
    video_files2 = [os.path.join(folder2, f) for f in os.listdir(folder2) if f.endswith(('.mp4', '.avi', '.mov'))]
    audio_files3 = [os.path.join(folder3, f) for f in os.listdir(folder3) if f.endswith(('.mp3', '.wav'))]
    audio_files4 = [os.path.join(folder4, f) for f in os.listdir(folder4) if f.endswith(('.mp3', '.wav'))]
 
    random_videos = random.sample(video_files1, 4) + [random.choice(video_files2)]
    random_audio3 = random.choice(audio_files3)
    random_audio4 = random.choice(audio_files4)
 
    try:
        # Создание видео клипов
        video_clips = [mp.VideoFileClip(video).resize((1080, 1920)) for video in random_videos]
        final_video = mp.concatenate_videoclips(video_clips)
 
        # Генерация субтитров
        subtitles_srt = 'subtitles.srt'
        generate_word_subtitles(random_audio3, subtitles_srt)
        final_video = add_subtitles_from_file(final_video, subtitles_srt)
 
        # Создание текстовых клипов "бот в профиле" и "пиши + в комменты"
        fixed_text2 = "пиши софт в комменты"
        fixed_text_clip2 = TextClip(fixed_text2, fontsize=36, color='yellow', stroke_color='black', stroke_width=2, font='Arial-Black')
 
        # Устанавливаем текст с самого начала видео
        fixed_text_clip2 = fixed_text_clip2.set_duration(final_video.duration).set_position((200, 1300)).set_opacity(0.5)
 
        # Добавляем текстовые клипы в видео
        final_video = CompositeVideoClip([final_video, fixed_text_clip2])
 
        # Обработка аудиофайлов
        voiceover = ensure_audio_duration(random_audio3, final_video.duration)
        music = ensure_audio_duration(random_audio4, final_video.duration).volumex(0.35)
 
        # Комбинирование аудиодорожек
        final_audio = mp.CompositeAudioClip([voiceover.set_duration(final_video.duration), music.set_duration(final_video.duration)])
        final_video = final_video.set_audio(final_audio)
 
        # Запись финального видео
        final_video.write_videofile(output_video, codec='libx264', audio_codec='aac')
    except Exception as e:
        print(f"Error creating final video: {e}")
 
 
def create_videos_in_parallel(folder1, folder2, folder3, folder4, output_dir, num_videos, repeats):
    with ThreadPoolExecutor(max_workers=num_videos) as executor:
        futures = []
        for i in range(repeats):
            for j in range(num_videos):
                output_filename = f'final_output_{i*num_videos + j + 1}.mp4'
                futures.append(executor.submit(create_final_video, folder1, folder2, folder3, folder4, output_dir, output_filename))
        
        for future in futures:
            try:
                future.result()
            except Exception as e:
                print(f"Error: {e}")
 
folder1 = r'D:онтаж ВидеоенераторовоеКреоапичМелстрой'
folder2 = r'D:онтаж Видеоенераторот'
folder3 = r'D:онтаж ВидеоенераторовоеКреозвучка'
folder4 = r'D:онтаж ВидеоенераторовоеКреореки'
output_dir = r'D:онтаж ВидеоенераторовоеКреотоговыеВидео'
num_videos = 2  # Number of videos to create in parallel
repeats = 1  # Number of times to repeat the process
 
create_videos_in_parallel(folder1, folder2, folder3, folder4, output_dir, num_videos, repeats)
Миниатюры
Ускорить процесс генерации видео moviepy  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.08.2024, 16:03
Ответы с готовыми решениями:

moviepy темнит видео
При использовании moviepy заметил, что видео становится темнее после обработки. Может кто знает лечение? Нужно mp4 переделать с другим...

Как ускорить процесс
Я в VBA начинающий, создал такок вот чудо: For tt = 2 To 13 For u = 3 To 70 For u2 = 10 To 140 If...

Нужно ускорить процесс
Делаю фильтр к таблице AdvStringGrid, на подобии Excel. При открытии фильтра нужно пробежаться по всем записям запроса, а внутри еще один...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.08.2024, 16:03
Помогаю со студенческими работами здесь

Ускорить процесс хэширования
Создаю сайт браузерного майнинга, где начальный хэш, хэширует сам себя до бесконечности Можете посмотреть и попробовать) ...

Ускорить процесс обработки информации
Добрый день! Я запускаю цикл: for(let i = 0; i &lt; 20; i++){ await getInfo(price(i)) } Но это занимает слишком много...

Необходимо ускорить админ процесс
Были изменены сертификаты пользователей. Теперь админ процесс убирает пользователя в ацл базах и т.д. Этот процесс занимает 20 дней, а...

Ускорить процесс сортировки Sedgewick's
Здравствуйте, мне нужно сравнить два вида сортировки: Shell original sequence и Shell Sedgewicks sequence, и написать среднее время...

Как ускорить процесс выборки?
Есть таблица в эксессе с большим кол-вом записей. Около 170 000. При загрузке формы соединяюсь с базой и делаю выборку. В нее попадает ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru