如何用巨蟒的图像制作电影

我目前尝试用图像制作一部电影,但我找不到任何有用的东西。

以下是我目前的代码:

import time


from PIL import  ImageGrab


x =0


while True:
try:
x+= 1
ImageGrab().grab().save('img{}.png'.format(str(x))
except:
movie = #Idontknow
for _ in range(x):
movie.save("img{}.png".format(str(_)))


movie.save()
226470 次浏览

您可以考虑使用像 ffmpeg 这样的外部工具将图像合并到一部电影中(参见答案 给你) ,或者您可以尝试使用 OpenCv 将图像合并到一部电影中,如示例 给你所示。

我附上下面的代码剪辑,我用来合并所有 png 文件从一个文件夹称为“图像”到一个视频。

import cv2
import os


image_folder = 'images'
video_name = 'video.avi'


images = [img for img in os.listdir(image_folder) if img.endswith(".png")]
frame = cv2.imread(os.path.join(image_folder, images[0]))
height, width, layers = frame.shape


video = cv2.VideoWriter(video_name, 0, 1, (width,height))


for image in images:
video.write(cv2.imread(os.path.join(image_folder, image)))


cv2.destroyAllWindows()
video.release()

这个答案中评论最多的部分似乎是 录像作家的使用。您可以在这个答案(静态)的链接中查找它的文档,或者您可以自己进行一些挖掘。第一个参数是文件名,后面跟着一个整数(文档中的 4cc,使用的编解码器)、 FPS 计数和帧尺寸的元组。如果你真的喜欢挖那个蠕虫罐头,这是 4cc 视频编解码器列表

谢谢,但我找到了另一种使用 ffmpeg 的解决方案:

def save():
os.system("ffmpeg -r 1 -i img%01d.png -vcodec mpeg4 -y movie.mp4")

但是谢谢你的帮助:)

下面是一个使用 film epy 的小例子,对我来说这是最简单的解决方案。

import os
import moviepy.video.io.ImageSequenceClip
image_folder='folder_with_images'
fps=1


image_files = [os.path.join(image_folder,img)
for img in os.listdir(image_folder)
if img.endswith(".png")]
clip = moviepy.video.io.ImageSequenceClip.ImageSequenceClip(image_files, fps=fps)
clip.write_videofile('my_video.mp4')

我使用 ffmpeg-python绑定。你可以找到更多的信息 给你

import ffmpeg
(
ffmpeg
.input('/path/to/jpegs/*.jpg', pattern_type='glob', framerate=25)
.output('movie.mp4')
.run()
)

当使用电影的 ImageSequenceClip是重要的图像是在一个有序的序列。

虽然 文件声明框架可以在引擎盖下按字母数字排序,但我发现情况并非如此。

因此,如果您有问题,请确保首先手动订购框架。

@ Wei Shan Lee (和其他人) : 当然,我的整个代码看起来是这样的

import os
import moviepy.video.io.ImageSequenceClip
from PIL import Image, ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True


image_files = []


for img_number in range(1,20):
image_files.append(path_to_images + 'image_folder/image_' + str(img_number) + '.png')


fps = 30


clip = moviepy.video.io.ImageSequenceClip.ImageSequenceClip(image_files, fps=fps)
clip.write_videofile(path_to_videos + 'my_new_video.mp4')

我已经创建了一个函数来执行这个操作。与第一个答案类似(使用 opencv) ,但是想为我添加这个答案。”。Mp4”格式不起作用。这就是为什么我在函数中使用了加法。

import cv2
import typing


def write_video(video_path_out:str,
frames_sequence:typing.Tuple[np.ndarray,...]):
  

if ".mp4" in video_path_out: raise ValueError("[ERROR] This method does not support .mp4; try .avi instead")
height, width, _ = frames_sequence[0].shape
# 0 means no preprocesing
# 1 means  each image will be played with 1 sec delay (1fps)
out = cv2.VideoWriter(video_path_out,0, 1,(width,height))
for frame in frames_sequence:
out.write(frame)
out.release()


# you can use as much images as you need, I just use 3 for this example
# put your img1_path,img2_path, img3_path


img1 = cv2.imread(img1_path)
img2 = cv2.imread(img2_path)
img3 = cv2.imread(img3_path)
# img1 can be cv2.imread out; which is a np.ndarray; you can also se PIL
# if you'd like to.
frames_sequence = [img1,img2,img3]


write_video(video_path_out = "mypath_outvideo.avi",
frames_sequence = frames_sequence
)

希望有用!