使用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图像合成视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • numpy矩阵数值太多不能全部显示的解决

    numpy矩阵数值太多不能全部显示的解决

    这篇文章主要介绍了numpy矩阵数值太多不能全部显示的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python的for和break循环结构中使用else语句的技巧

    Python的for和break循环结构中使用else语句的技巧

    平时我们把在if结构中使用else语句当作理所当然,然而,Python强大的语法糖可以让else语句在for和while循环中使用!下面我们就通过例子来看一下Python的for和break循环结构中使用else语句的技巧
    2016-05-05
  • 详解python os.walk()方法的使用

    详解python os.walk()方法的使用

    今天给大家带来的是关于Python的相关知识,文章围绕python os.walk()方法的使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Python第三方库h5py_读取mat文件并显示值的方法

    Python第三方库h5py_读取mat文件并显示值的方法

    今天小编就为大家分享一篇Python第三方库h5py_读取mat文件并显示值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Opencv 图片的OCR识别的实战示例

    Opencv 图片的OCR识别的实战示例

    这篇文章主要介绍了Opencv 图片的OCR识别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Scrapy基于selenium结合爬取淘宝的实例讲解

    Scrapy基于selenium结合爬取淘宝的实例讲解

    今天小编就为大家分享一篇Scrapy基于selenium结合爬取淘宝的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

    Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

    Python 是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python 能够帮助我们快速处理、分析数据并生成高质量的可视化图表,本文将详细介绍 Python 中的数据分析与可视化的基础知识,并结合丰富的示例和技巧,帮助读者深入理解这些概念
    2025-06-06
  • Python使用metaclass实现Singleton模式的方法

    Python使用metaclass实现Singleton模式的方法

    这篇文章主要介绍了Python使用metaclass实现Singleton模式的方法,实例分析了Python基于metaclass实现单例模式的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-05-05
  • python中日志logging模块的性能及多进程详解

    python中日志logging模块的性能及多进程详解

    使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析。Python的logging模块就是这种情况下的好帮手。本文就介绍了python中日志logging模块性能及多进程的相关资料,需要的朋友可以参考下。
    2017-07-07
  • Python实现抓取页面上链接的简单爬虫分享

    Python实现抓取页面上链接的简单爬虫分享

    这篇文章主要介绍了Python实现抓取页面上链接的简单爬虫分享,本文使用了一个开源模块requests实现需求,需要的朋友可以参考下
    2015-01-01

最新评论