python сгенерировать 5-ти секундное mp4 видео из одного фото

как при помощи python сгенерировать из одного фото (jpg) видео (mp4) длиной 5 секунд?

Я пробовал movepy и FFmpeg, но на выходе получается серое видео

from moviepy.editor import *
files = ['1.jpg', '1.jpg']
clip = ImageSequenceClip(files, fps = 4) 
clip.write_videofile("video.mp4", fps = 24)

Ответы (1 шт):

Автор решения: Johan

Попробуйте сделать вот так:

from moviepy.editor import *


def clip_from_image(image, name_clip, s_duration):
    """
    :param image: путь к изображению
    :param name_clip: имя результирующего видео mp4
    :param s_duration: время длительности клипа в секундах
    :return: выход из функции
    """
    try:
        dur = float(s_duration)
    except ValueError:
        print('[-] Неверное значение длительности кадра')
        return

    print('[+] Создание видео')
    clips = ImageClip(image).set_duration(dur)
    clips.write_videofile(f'{name_clip}.mp4', fps=25)
    return


clip_from_image(image='test.jpg', name_clip='123', s_duration=5)

А так можно с помощью OpenCV:

import cv2
import numpy as np
from PIL import Image


def img_to_mp4(path_img: str, vid_name: str, dur: int):
    """
    :param path_img: путь к изображению
    :param vid_name: имя результирующего видео mp4
    :param dur: время длительности клипа в секундах
    """
    img = Image.open(path_img)

    f_rate = 30.0
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out_scr = cv2.VideoWriter(f"{vid_name}.mp4", fourcc, f_rate, (img.width, img.height))

    for im in range(0, dur*int(f_rate)):
        frame = np.array(img)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        out_scr.write(frame)

img_to_mp4(path_img='X2Q6dQuRLw4.jpg', vid_name='123', dur=5)
→ Ссылка