批量制作短视频神器: 教你快速自动化合成 1000 个视频

avatar

背景

一般情况下, 我们是使用各种软件(APP)来剪辑合成视频的. 但对于需要批量处理的场景, 例如要做 1000 个短视频时, 还是使用 APP 挨个来做的话, 效率就太低了!

面对需要批量处理的场景, 我们必须采取自动化手段来合成视频.

方案

接下来, 我将使用 moviepy 来实践自动化合成视频的各种场景.

MoviePy is a Python module for video editing, which can be used for basic operations (like cuts, concatenations, title insertions), video compositing (a.k.a. non-linear editing), video processing, or to create advanced effects. It can read and write the most common video formats, including GIF.

原始视频 image.png

合成视频 image.png

提示: 以下代码均在 魔搭 Notebook 环境中执行通过

安装环境

按照官方教程执行示例的时候, 报错 ImageMagick 没有安装, 就尝试各种安装 ImageMagick, 但折腾了好久还是报错 :(

最终通过 ImageMagick not detected by moviepy while using SubtitlesClip 中提到的解决办法, 才装好环境将示例跑成功了

!apt update
!apt install imagemagick -y
!apt install ffmpeg -y
!pip3 install moviepy[optional]
!sed -i '/<policy domain="path" rights="none" pattern="@\*"/d' /etc/ImageMagick-6/policy.xml

换背景

一般为了便于后期处理, 我们拍摄的视频是绿幕背景的视频, 在合成视频的时候会将绿幕替换成任意的背景

参考 Green Screen Video, 核心代码是运用 mask_color 特效去除绿幕

video_file_clip = VideoFileClip("green_screen.mp4")
green_screen_color = [93, 222, 72] # RGB
video_file_clip = video_file_clip.fx(vfx.mask_color, color=green_screen_color, thr=80, s=5)

其中 color 设置为绿幕视频中绿幕的颜色, 由于绿幕的颜色不一定均匀, 还需要微调阈值和敏感度(thrs)

加文字

默认使用的字体不支持中文, 需要指定中文字体, 根据提示 NO chinese subtitle 改用中文字体即可(可以指定字体文件, 或者通过 TextClip.list('font') 方法看下是否有中文字体)

# 可指定字体文件(msyh.ttc 微软雅黑字体)
# text_clip = TextClip("批量制作短视频神器", fontsize=70, font="msyh.ttc", color='white')
# 指定中文字体
text_clip = TextClip("批量制作短视频神器", fontsize=70, font="文泉驿微米黑", color='white')

加字幕

准备好字幕文件, 即可给视频添加上字幕

generator = lambda text: TextClip(text, font='文泉驿微米黑', fontsize=32, color='white')
subtitles_clip = SubtitlesClip("1.srt", generator)

加图片

image_clip = ImageClip("1.jpg")

加音乐

audio_file_clip = AudioFileClip('1.mp3')

完整代码

from moviepy.editor import *
from moviepy.video.tools.subtitles import SubtitlesClip

# 原始视频(绿幕)
video_file_clip = VideoFileClip("green_screen.mp4")

# 去除绿幕
green_screen_color = [93, 222, 72]
video_file_clip = video_file_clip.fx(vfx.mask_color, color=green_screen_color, thr=80, s=5)
# 背景
background_image_clip = ImageClip('2.png')
background_image_clip = background_image_clip.resize(video_file_clip.size).set_duration(video_file_clip.duration)

# 文字
text_clip = TextClip("批量制作短视频神器", fontsize=70, font="文泉驿微米黑", color='white')
text_clip = text_clip.set_position('center').set_duration(video_file_clip.duration)

# 字幕
generator = lambda text: TextClip(text, font='文泉驿微米黑', fontsize=32, color='white')
subtitles_clip = SubtitlesClip("1.srt", generator)
subtitles_clip = subtitles_clip.set_position(("center", video_file_clip.h - 130))

# 图片
image_clip = ImageClip("1.jpg")
image_clip = image_clip.resize(width=80, height=80).set_position(("right", "top")).set_duration(video_file_clip.duration)

# 音乐
video_audio_clip = video_file_clip.audio.volumex(0.8)
audio_file_clip = AudioFileClip('1.mp3').volumex(0.5)
composite_audio_clip = CompositeAudioClip([video_audio_clip, audio_file_clip])
video_file_clip = video_file_clip.set_audio(composite_audio_clip)

# 合成视频
video = CompositeVideoClip([
    background_image_clip, # 背景
    video_file_clip,       # 原视频
    text_clip,             # 文字
    image_clip,            # 图片
    subtitles_clip         # 字幕
])

# 写到文件
# video.write_videofile("green_screen_edited.webm")

ipython_display(video)