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

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

一、任务点分解:

  • 使用 Pillow 库批量读取和缩放图像;
  • 使用 MoviePy 将图像序列合成视频;
  • 精准控制帧率与每张图片的显示时间;
  • 向视频添加背景音乐;
  • 基础的异常处理与调试技巧。

二、项目简介

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

  • 批量读取某文件夹下的图像;
  • 统一调整图像尺寸;
  • 将图像序列按顺序合成为一个视频文件;
  • 为生成的视频添加背景音乐(可选);
  • 输出一个完整的视频文件,支持播放与分享。

三、核心代码与讲解

1. 导入所需模块

from moviepy.editor import ImageSequenceClip, AudioFileClip
from PIL import Image
import numpy as np
import os
  • moviepy.editor 是处理视频和音频的高阶接口;
  • PIL.Image 用于图像读取与缩放;
  • numpy 用于图像数据处理(如计算平均亮度);
  • 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

📌 本函数实现以下功能:

  • 遍历指定文件夹中所有图片文件;
  • 将图片缩放为统一大小(1280×720);
  • 将每张图片转换为 NumPy 数组,准备后续视频合成;
  • 并打印图像的平均亮度(用于分析图像是否太暗或空白);
  • 如果图片读取失败,进行异常捕获并输出错误信息。

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("⚠️ 未添加背景音乐(未找到或未提供)")

📌 说明:

  • duration_per_image:每张图片显示的时间(秒);
  • fps:帧率(每秒显示多少帧);
  • 每张图通过重复若干帧来模拟“停留”;
  • 使用 ImageSequenceClip 构造视频片段;
  • 支持添加背景音乐(mp3)并同步到视频时长;
  • 最终输出视频 output.mp4 和 final_output.mp4(带音频版本)。

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 文件

五、运行效果与验证

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

  • output.mp4:图像合成的视频;
  • final_output.mp4:添加背景音乐后的完整视频;

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

六、拓展建议

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

七、小结

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

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

相关文章

  • Python islower()函数的使用详解

    Python islower()函数的使用详解

    这篇文章主要介绍了Python islower()函数使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Python高级应用探索之元编程和并发编程详解

    Python高级应用探索之元编程和并发编程详解

    Python作为一种简单易用且功能强大的编程语言,广泛应用于各个领域,本文主要来和大家一起探索一下Python中的优化技巧、元编程和并发编程,希望对大家有所帮助
    2023-11-11
  • python核心语法运算符详解

    python核心语法运算符详解

    文章介绍了Python中的运算符和类型转换,运算符包括算术运算符、赋值运算符和复合赋值运算符,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • 详解Python中的Numpy、SciPy、MatPlotLib安装与配置

    详解Python中的Numpy、SciPy、MatPlotLib安装与配置

    这篇文章主要介绍了详解Python中的Numpy、SciPy、MatPlotLib安装与配置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Python连接KingbaseES的实战指南

    Python连接KingbaseES的实战指南

    在数据库国产化替代的大背景下,人大金仓KingbaseES作为国产数据库的佼佼者,其应用生态日益完善,本文给大家介绍了使用了Python连接KingbaseES的Ksycopg2驱动,需要的朋友可以参考下
    2025-10-10
  • python3读取csv文件任意行列代码实例

    python3读取csv文件任意行列代码实例

    这篇文章主要介绍了python3读取csv文件任意行列代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 教你pycharm运行Django第一个项目

    教你pycharm运行Django第一个项目

    本文主要介绍了教你pycharm运行Django第一个项目的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • Python结合PyQt和Flask实现桌面端一键启动/关闭Web服务的应用

    Python结合PyQt和Flask实现桌面端一键启动/关闭Web服务的应用

    本文将以一个完整示例演示如何结合 PyQt 与 Flask,轻松打造一个桌面应用,实现对本地 Web 服务的一键启动与停止,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-12-12
  • Numpy之布尔索引的实现

    Numpy之布尔索引的实现

    本文主要介绍了Numpy之布尔索引的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • pip版本低导致Python离线包安装失败的问题解决

    pip版本低导致Python离线包安装失败的问题解决

    在使用Python进行开发时,安装各种第三方库是必不可少的,不过,有时候我们会遇到一些麻烦,尤其是当pip的版本较低时,下面我们来看看如何解决这一问题吧
    2025-03-03

最新评论