1 / 1 / 0
Регистрация: 24.08.2022
Сообщений: 16

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

15.08.2024, 16:03. Показов 927. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru