python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > MoviePy图像合成视频

使用MoviePy实现图像序列合成视频并添加背景音乐

作者:univerbright

本文主要介绍了使用MoviePy实现图像序列合成视频并添加背景音乐,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、任务点分解:

二、项目简介

我们将构建一个图像转视频生成器,实现如下功能:

三、核心代码与讲解

1. 导入所需模块

from moviepy.editor import ImageSequenceClip, AudioFileClip
from PIL import Image
import numpy as np
import os

2. 图像预处理函数

def resize_images(image_folder, target_size=(1280, 720)):
    """统一缩放文件夹内所有图片"""
    resized_images = []
    for img_name in sorted(os.listdir(image_folder)):
        if img_name.lower().endswith(('.jpg', '.png')):
            img_path = os.path.join(image_folder, img_name)
            try:
                with Image.open(img_path) as img:
                    print(f"{img_name} - 平均亮度: {np.array(img).mean()}")
                    img = img.resize(target_size, Image.LANCZOS)
                    resized_images.append(np.array(img.copy()))  # ⚠️ 返回 np.array
            except Exception as e:
                print(f"❌ 图像读取失败:{img_path}, 错误信息: {e}")
    return resized_images

📌 本函数实现以下功能:

3. 图像序列合成视频

def images_to_video(image_arrays, duration_per_image, fps, audio_path=None, output_name="output.mp4"):
    """
    使用 ImageSequenceClip(fps=...) 严格控制帧率与帧数
    每张图显示 duration 秒
    """
    # 计算重复每张图片的帧数
    frames_per_image = int(duration_per_image * fps)

    # 重复图片,使得每张图片持续多帧
    repeated_frames = []
    for img in image_arrays:
        repeated_frames.extend([img] * frames_per_image)

    # 生成视频剪辑
    clip = ImageSequenceClip(repeated_frames, fps=fps)

    # 写出视频
    clip.write_videofile(output_name, fps=fps)

    # 添加背景音乐(可选)
    if audio_path and os.path.exists(audio_path):
        print("🎵 添加背景音乐...")
        audio = AudioFileClip(audio_path).set_duration(clip.duration)
        final_clip = clip.set_audio(audio)
        final_clip.write_videofile("final_" + output_name, fps=fps)
    else:
        print("⚠️ 未添加背景音乐(未找到或未提供)")

📌 说明:

4. 主程序调用

# 参数配置
image_folder = 'image_test/'
fps = 1
duration = 5
audio_path = 'bgm.mp3'

# 执行处理
resized_images = resize_images(image_folder, target_size=(1280, 720))

if resized_images:
    images_to_video(
        image_arrays=resized_images,
        duration_per_image=duration,
        fps=fps,
        audio_path=audio_path,
        output_name="output.mp4"
    )
else:
    print("⚠️ 没有可用的图片,视频未生成。")

四、关键知识点解析

知识点说明
Image.resize()调整图像尺寸,保证视频尺寸一致性
np.array(img)将图像对象转为像素矩阵,供 MoviePy 使用
ImageSequenceClip(images, fps)生成连续帧的视频剪辑
extend([img]*n)模拟图片停留 n 帧,实现每张图片显示固定秒数
AudioFileClip(...).set_duration()音频剪辑并对齐到视频时长
.write_videofile()写出 mp4 文件

五、运行效果与验证

运行成功后,项目目录中应生成以下两个文件:

建议使用 VLC 播放器或其他专业播放器验证帧起始是否准确。

六、拓展建议

该项目封装成 GUI 应用或 Web 服务。

七、小结

本文通过实际项目引导,讲解了 Python 图像与视频处理的基本操作,涵盖图像缩放、图像序列合成、帧率控制、音频合并等常见任务。

到此这篇关于使用MoviePy实现图像序列合成视频并添加背景音乐的文章就介绍到这了,更多相关MoviePy图像合成视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文