Python实现JPEG转视频

15

我正在寻找一种使用Python将图像文件夹(例如JPEG)连接到电影文件(MOV,MP4,AVI)的方法。理想情况下,这还将允许我从该目录中获取多个JPEG并将它们“粘贴”到网格中作为电影文件的一个帧。哪些模块可以实现这一点?


1
使用libavfilters构建的ffmpeg应该可以轻松实现这一点。 - wim
mencoder也很容易使用subprocess调用,这就是chronolapse如何完全实现您所要求的内容(将图像转换为电影,而不是将图像转换为网格再制作电影)。您可以使用PIL首先创建复合网格图像,然后以同样的方式将它们编译成电影。 - Collin Green
4个回答

8
你可以使用OpenCV的Python接口,特别是VideoWriter可能可以完成任务。根据文档的理解,以下内容可以实现你的需求:
w = cvCreateVideoWriter(filename, -1, <your framerate>, 
                        <your frame size>, is_color=1)

并且,在一个循环中,对于每个文件:

cvWriteFrame(w, frame)

请注意,我没有尝试过这段代码,但我认为我理解了正确的思路。如果它可行,请告诉我。

VideoWriter引用的超链接已损坏。可能需要查看OpenCV源代码,而不是第三方库。 - EngrStudent
@EngrStudent 感谢您的反馈。已修复。 - agravier

3
这是我有一个脚本的裁剪版本,它从一个视频中获取帧并对其进行修改(该代码已被删除),然后写入另一个视频。也许这会有所帮助。
import cv2

fourcc = cv2.cv.CV_FOURCC(*'XVID')
out = cv2.VideoWriter('out_video.avi', fourcc, 24, (704, 240))

c = cv2.VideoCapture('in_video.avi')

while(1):
  _, f = c.read()
  if f is None:
    break

  f2 = f.copy() #make copy of the frame
  #do a bunch of stuff (missing)

  out.write(f2)  #write frame to the output video

out.release()
cv2.destroyAllWindows()
c.release()

如果你有一堆图片,可以通过循环将它们加载,并依次写入到你的视频中。

1

我终于进入了一个能工作的项目版本,这也是我提出这个问题的原因。 现在我想用自己得到的知识做出贡献。 以下是我获取当前目录中所有图片并将其转换为视频的解决方案,在黑色背景中居中显示,因此该解决方案适用于不同大小的图像。

import glob
import cv2
import numpy as np

DESIRED_SIZE = (800, 600)
SLIDE_TIME = 5 # Seconds each image
FPS = 24

fourcc = cv2.VideoWriter.fourcc(*'X264')
writer = cv2.VideoWriter('output.avi', fourcc, FPS, DESIRED_SIZE)

for file_name in glob.iglob('*.jpg'):
    img = cv2.imread(file_name)

    # Resize image to fit into DESIRED_SIZE
    height, width, _ = img.shape
    proportion = min(DESIRED_SIZE[0]/width, DESIRED_SIZE[1]/height)
    new_size = (int(width*proportion), int(height*proportion))
    img = cv2.resize(img, new_size)

    # Centralize image in a black frame with DESIRED_SIZE
    target_size_img = np.zeros((DESIRED_SIZE[1], DESIRED_SIZE[0], 3), dtype='uint8') 
    width_offset = (DESIRED_SIZE[0] - new_size[0]) // 2
    height_offset = (DESIRED_SIZE[1] - new_size[1]) // 2
    target_size_img[height_offset:height_offset+new_size[1], 
                    width_offset:width_offset+new_size[0]] = img

    
    for _ in range(SLIDE_TIME * FPS):
        writer.write(target_size_img)

writer.release()

0

对于您来说,解决方案是否必须使用Python并生成电影文件真的很重要吗?还是这些只是您对解决方案外观的期望?

如果您只想能够播放一堆JPEG文件作为电影,您可以不使用Python或通过访问vidmyfigs.com并使用鼠标从硬盘中选择图像文件来避免在计算机上混乱.avi/.mov/mp4文件。 "电影"将在您的Web浏览器中播放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接