не полyчается загнать все картинки для создания видео со сменой кадров в Python

Рейтинг: -1Ответов: 1Опубликовано: 26.07.2023
from tkinter import *
import os
from tkinter import filedialog
import cv2
import time
from moviepy.editor import *
#pip3 install opencv-python
#import imageio
root = Tk()
root.title("Video Maker")
root.geometry("300x150")

mp3_file = ""
image_folder = ""
video_duration = 300 #time screen pict

def choose_mp3():
    global mp3_file
    mp3_file = filedialog.askopenfilename(filetypes = (("MP3 files", "*.mp3"),("All files", "*.*")))
    print("choosen mp3 file:", mp3_file)

def choose_folder():
    global image_folder
    image_folder = filedialog.askdirectory()
    print("choosen image folder:", image_folder)

def create_video():
    if not mp3_file or not image_folder:
        print("Пожалуйста, выберите mp3 и папку с изображениями!")
        return

    video_name = "video.mp4"
    image_files = [f for f in os.listdir(image_folder) if f.endswith('.png') or f.endswith('.jpg')]

    frames = []
    img_paths = []

    for image_file in image_files:
        frame = cv2.imread(os.path.join(image_folder, image_file))
        img_path = os.path.join(image_folder, image_file)
        frames.append(frame)
        img_paths.append(img_path)

    height, width, _ = frames[0].shape
    size = (width, height)
    fps = 1000 // video_duration

    video_writer = cv2.VideoWriter(video_name, cv2.VideoWriter_fourcc(*'mp4v'), fps, size)

    for i in range(len(frames)):
        frame = frames[i]
        img_path = img_paths[i]
        video_writer.write(frame)
        time.sleep(video_duration / 1000)

    video_writer.release()

    audio = AudioFileClip(mp3_file)
    video = VideoFileClip(video_name)
    final_video = video.set_audio(audio)
    final_video.write_videofile("final_video.mp4", codec="libx264")

    print("Создание видео завершено!")

mp3_button = Button(root, text="MP3", command=choose_mp3)
mp3_button.pack()
folder_button = Button(root, text="Pictures", command=choose_folder)
folder_button.pack()
video_button = Button(root, text="make video", command=create_video)
video_button.pack()

root.mainloop()

не полyчается загнать все картинки из папки в видео слайд-шоy так то раБо4ий скрипт только он Берёт однy картинкy а не всю директорию хотелось Бы наделать видосиков для сеБя с Быстрой сменой кадров в миллисекyнд 300

Ответы

▲ 0
import os  #для работы с операционной системой
from moviepy.editor import *  #для обработки видеофайлов
from PIL import Image  #для работы с изображениями
# Параметры
audio_path = '1.mp3'  # Замени на реальный путь к музыкальному файлу
image_dir = '05.2022'  # Замени на путь к папке с картинками
output_video = 'magic_video.mp4'  # Название твоего будущего клипа
duration_per_image = 0.3  # Сколько секунд будет показываться каждая картинка
#изменяет размер и центрирует изображение
def resize_image(image_path, size):
    with Image.open(image_path) as img:
        img.thumbnail(size, Image.ANTIALIAS)
        background = Image.new('RGBA', size, (255, 255, 255, 0))
        background.paste(
            img, (int((size[0] - img.size[0]) / 2), int((size[1] - img.size[1]) / 2))
        )
        return background


# Получаем список картинок
image_files = [os.path.join(image_dir, img) for img in os.listdir(image_dir) if img.endswith(('.jpg', '.jpeg', '.png'))]
resized_images = []
#Изменяем размер каждого изображения, сохраняем их в новый список resized_images
for i, image_file in enumerate(image_files):
        resized_image = resize_image(image_file, (1024, 768))
        resized_image_path = os.path.join(image_dir, f"resized_{i}.png")
        resized_image.save(resized_image_path, format="png")
        resized_images.append(resized_image_path)
# Получаем длительность аудио
audio_clip = AudioFileClip(audio_path)
audio_duration = audio_clip.duration

# Проверяем, чтобы суммарная длительность показа всех изображений была не меньше,
#чем длительность аудиофайла. Если она меньше,
#увеличиваем количество повторов видеоклипов
final_clips = []
for img_path in resized_images:
    img_clip = ImageClip(img_path).set_duration(duration_per_image)
    final_clips.append(img_clip)

# Убедимся, что картинки будут показываться весь аудиотрек
total_image_duration = duration_per_image * len(image_files)
if total_image_duration < audio_duration:
    repeat_factor = audio_duration // total_image_duration + 1
    repeat_factor = int(repeat_factor)
    final_clips = final_clips * repeat_factor

# Обрезаем, если последний повтор слишком длинный
final_clips = concatenate_videoclips(final_clips).set_duration(audio_duration)

#Ресайзим картинки под один размер (высокое разрешение, например 1080p)
#в два раза усложняет работу скрипта
#final_clips = final_clips.resize(newsize=(1920, 1080))

# Добавляем аудио
final_video = final_clips.set_audio(audio_clip)

# Экспортируем видео
final_video.write_videofile(output_video, codec='libx264', audio_codec='aac', fps=24)
# Удалим временные картинки
for img in resized_images:
        os.remove(img)