【Python音视频技术】用moviepy实现图文成片功能

今天上班的时候看到有人群里问 图文成片怎么实现。 临时给我提供一点写作的灵感,趁着下班写一篇。这里用到 python的moviepy库, 之前文章介绍过。

大体思路:假定有4张图片,每张图片将在视频中展示2秒钟,并且图片会按照顺序循环播放,直到音频结束。

python 复制代码
from moviepy.efrom moviepy.editor import ImageClip, AudioFileClip, concatenate_videoclips, CompositeVideoClip
from moviepy.audio.fx.all import audio_loop
from PIL import Image
import os


def resize_images(image_files, desired_size):
    resized_images = []
    for image_file in image_files:
        # 打开一张图片文件
        with Image.open(image_file) as img:
            # 调整图片大小到目标尺寸
            img = img.resize(desired_size, Image.ANTIALIAS)
            # 将调整后的图片保存到临时文件
            temp_file = f"temp_{os.path.basename(image_file)}"
            img.save(temp_file)
            resized_images.append(temp_file)
    return resized_images


def create_video_from_images(image_files, audio_file, output_file, fps=24, desired_size=(1280, 720)):
    # 将图片调整到目标尺寸
    resized_images = resize_images(image_files, desired_size)

    # 加载音频文件
    audio = AudioFileClip(audio_file)

    # 设置图片展示时长为2秒
    image_duration = 2

    # 创建单独的图片剪辑并设置展示时长
    clips = [ImageClip(img).set_duration(image_duration).set_fps(fps) for img in resized_images]

    # 将所有图片剪辑拼接成循环播放的一个视频剪辑
    video_clip = concatenate_videoclips(clips, method="compose").loop(duration=audio.duration)

    # 给视频剪辑设置音频
    final_video = video_clip.set_audio(audio)

    # 将结果写入输出文件
    final_video.write_videofile(output_file, codec="libx264", audio_codec="aac", fps=fps)

    # 清理临时文件
    for temp_file in resized_images:
        os.remove(temp_file)


# demo:
image_files = ['image1.jpg', 'image2.jpg', 'image3.jpg', 'image4.jpg']  # 图片文件列表
audio_file = 'background_music.mp3'  # 音频文件
output_file = 'output_video.mp4'  # 输出视频文件

create_video_from_images(image_files, audio_file, output_file)ditor import ImageClip, AudioFileClip, concatenate_videoclips, CompositeVideoClip
from moviepy.audio.fx.all import audio_loop
from PIL import Image
import os


def resize_images(image_files, desired_size):
    resized_images = []
    for image_file in image_files:
        # 打开一张图片文件
        with Image.open(image_file) as img:
            # 调整图片大小到目标尺寸
            img = img.resize(desired_size, Image.ANTIALIAS)
            # 将调整后的图片保存到临时文件
            temp_file = f"temp_{os.path.basename(image_file)}"
            img.save(temp_file)
            resized_images.append(temp_file)
    return resized_images


def create_video_from_images(image_files, audio_file, output_file, fps=24, desired_size=(1280, 720)):
    # 将图片调整到目标尺寸
    resized_images = resize_images(image_files, desired_size)

    # 加载音频文件
    audio = AudioFileClip(audio_file)

    # 设置图片展示时长为2秒
    image_duration = 2

    # 创建单独的图片剪辑并设置展示时长
    clips = [ImageClip(img).set_duration(image_duration).set_fps(fps) for img in resized_images]

    # 将所有图片剪辑拼接成循环播放的一个视频剪辑
    video_clip = concatenate_videoclips(clips, method="compose").loop(duration=audio.duration)

    # 给视频剪辑设置音频
    final_video = video_clip.set_audio(audio)

    # 将结果写入输出文件
    final_video.write_videofile(output_file, codec="libx264", audio_codec="aac", fps=fps)

    # 清理临时文件
    for temp_file in resized_images:
        os.remove(temp_file)


# demo:
image_files = ['image1.jpg', 'image2.jpg', 'image3.jpg', 'image4.jpg']  # 图片文件列表
audio_file = 'background_music.mp3'  # 音频文件
output_file = 'output_video.mp4'  # 输出视频文件

create_video_from_images(image_files, audio_file, output_file)

这里的图片素材采用腾讯智影生成, 音频采用suno生成。最后的效果

相关文章:

【Python音视频技术】玩AI视频创作引发写Python音视频技术系列文章1---视频添加字幕

【Python音视频技术】Python音视频技术系列文章2---视频提取音频转换文字

【Python音视频技术】Python音视频技术系列文章3---音频转换文字技术方案

原文链接:【Python音视频技术】用moviepy实现图文成片功能

相关推荐
怕浪猫4 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试
高洁014 小时前
具身智能中的世界模型训练
人工智能·python·深度学习·机器学习·transformer
无线通信科研笔记4 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
朝朝辞暮i5 小时前
VLA 系统学习第 1 课:VLA 到底在干什么?
人工智能·python·计算机视觉·vla
2601_962885725 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen6 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
北冥有鱼被烹6 小时前
VCSEL全景解析:与光模块NPO CPO的关系、市场量化分析与产业链影响
python
我可能是个假开发6 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong6 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
正在走向自律6 小时前
AI数据分析与可视化:从基础到应用实践
服务器·人工智能·python·机器学习·数据分析·pandas