背景
一般情况下, 我们是使用各种软件(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.
原始视频
合成视频
提示: 以下代码均在 魔搭 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
设置为绿幕视频中绿幕的颜色, 由于绿幕的颜色不一定均匀, 还需要微调阈值和敏感度(thr
和 s
)
加文字
默认使用的字体不支持中文, 需要指定中文字体, 根据提示 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)