我怎样才能将一组图片制作成mp4视频?

4
我正在尝试创建一个程序,可以输入源文件夹(例如包含JPEG图像的文件夹)和目标文件夹(MP4将保存在其中),我想能够设置每张图片之间的特定延迟,例如第一张图片显示1秒钟,第二张图片显示4秒钟。
我不想使用FFmpeg,而是在处理过程中编辑图片,所以我更倾向于使用for循环或类似的东西,这样我可以编辑每个图片。
我已经尝试过使用FFmpeg和moviepy,但我无法弄清楚如何做到这一点,有什么建议吗?
还有一个问题,如果有人知道如何将大小不正确的图像“复制”到图像的背景并使其变大并模糊化呢?这样,图像就具有其原始大小和模糊的背景,即其副本。

"我不想使用FFmpeg" 为什么不想用呢? - llogan
我想要能够更多地使用FFmpeg自定义代码,这很难。 - KingOfTNT10
你能举个例子说明你想用这些图片做什么处理吗? - EvensF
添加模糊背景(我的问题中的最后3行...),也可以转换为灰度等。 - KingOfTNT10
1个回答

2

如果您想手动完成,假设您有一堆 .jpeg 文件,并且您知道每个文件的持续时间,则可以使用 opencv.VideoWriter() 来基于帧速率重复帧,然后将所有帧写入输出。

import cv2

# Each video has a frame per second which is number of frames in every second
frame_per_second = 15

files_and_duration = [
    ('file1.jpeg', 4),
    ('file2.jpeg', 1),
    ('file3.jpeg', 2)
]

w, h = None, None
for file, duration in files_and_duration:
    frame = cv2.imread(file)

    if w is None:
        # Setting up the video writer
        h, w, _ = frame.shape
        fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
        writer = cv2.VideoWriter('output.mp4', fourcc, frame_per_second, (w, h))

    # Repating the frame to fill the duration
    for repeat in range(duration * frame_per_second):
        writer.write(frame)

writer.release()

1
只是想知道是否有必要将所有帧都累积在一个列表中存储在内存中...如果它是一段长视频,或者帧很大或帧率很高怎么办?逐帧写入是否更好?例如,1080p 24fps视频的帧每秒累积约150MB... - Mark Setchell
@MarkSetchell 谢谢您指出这一点,您是正确的,我已经更改了代码,使其在加载每个帧后将其写入磁盘。 - aminrd
很酷 - 我认为/希望这是更好的方法。你已经得到了我的支持。 - Mark Setchell
@KingOfTNT10 我之前在测试方形照片时发现frame.shape()返回的宽度和高度顺序不同。你能试一下吗?我已经修改了代码。 - aminrd
它起作用了,非常感谢!顺便问一下,您可能知道我在问题的最后三行中描述的事情怎么做吗? - KingOfTNT10
显示剩余4条评论

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