文章目录
- from moviepy.editor import ImageSequenceClip, AudioFileClip from PIL import Image import numpy as np import os moviepy.editor 是处理视频和音频的高阶接口; PIL.Image 用于图像读取与缩放; numpy 用于图像数据处理(如计算平均亮度); os 负责处理文件夹与文件路径。
- 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 数组,准备后续视频合成; 并打印图像的平均亮度(用于分析图像是否太暗或空白); 如果图片读取失败,进行异常捕获并输出错误信息。
- 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(带音频版本)。
- # 参数配置 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(“⚠️ 没有可用的图片,视频未生成。”)
目录
- 一、任务点分解:
- 二、项目简介
- 三、核心代码与讲解
- 1. 导入所需模块
- 2. 图像预处理函数
- 3. 图像序列合成视频
- 4. 主程序调用
- 四、关键知识点解析
- 五、运行效果与验证
- 六、拓展建议
- 七、小结
- 使用
Pillow 库批量读取和缩放图像;
- 使用
MoviePy 将图像序列合成视频;
- 精准控制帧率与每张图片的显示时间;
- 向视频添加背景音乐;
- 基础的异常处理与调试技巧。
Pillow 库批量读取和缩放图像;MoviePy 将图像序列合成视频;
我们将构建一个图像转视频生成器,实现如下功能:
- 批量读取某文件夹下的图像;
- 统一调整图像尺寸;
- 将图像序列按顺序合成为一个视频文件;
- 为生成的视频添加背景音乐(可选);
- 输出一个完整的视频文件,支持播放与分享。
from moviepy.editor import ImageSequenceClip, AudioFileClip
from PIL import Image
import numpy as np
import os
moviepy.editor 是处理视频和音频的高阶接口;
PIL.Image 用于图像读取与缩放;
numpy 用于图像数据处理(如计算平均亮度);
os 负责处理文件夹与文件路径。
moviepy.editor 是处理视频和音频的高阶接口;PIL.Image 用于图像读取与缩放;numpy 用于图像数据处理(如计算平均亮度);os 负责处理文件夹与文件路径。
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 数组,准备后续视频合成;
- 并打印图像的平均亮度(用于分析图像是否太暗或空白);
- 如果图片读取失败,进行异常捕获并输出错误信息。
📌 本函数实现以下功能:
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(带音频版本)。
📌 说明:
duration_per_image:每张图片显示的时间(秒);fps:帧率(每秒显示多少帧);ImageSequenceClip 构造视频片段;output.mp4 和 final_output.mp4(带音频版本)。
# 参数配置
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图像合成视频内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- MoviePy简介及Python视频剪辑自动化
- python用moviepy对视频进行简单的处理
- Python使用MoviePy轻松搞定视频编辑
- python moviepy 的用法入门篇
- MoviePy常用剪辑类及Python视频剪辑自动化
- Python视频剪辑Moviepy库使用教程
- python基于moviepy实现音视频剪辑
- Python使用MoviePy实现编辑音视频并添加字幕
- Python使用moviepy读取字幕srt文件报错的解决方法详解
- Moviepy模块实现视频添加图片水印
- 基于Python和MoviePy实现照片管理和视频合成工具