影片混合与排列显示
这篇文章会介绍使用 Python 的 moviepy 第三方函数库,将多支影片排列在同一个画面中同时播放,或将多支影片混合成为一支影片 ( 混合声音或半透明混合 ),以及运用混合的方式,做出不同影片间淡入淡出转换的效果。
快速导览:
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
安装 moviepy
输入下列指令安装 moviepy,根据个人环境使用 pip 或 pip3。
!pip install moviepy
由于影片转档会使用 ffmpeg,因此也要安装 ffmpeg ( 影片存档常见错误“TypeError: must be real number, not NoneType”往往都是 ffmpeg 没有安装导致 ),根据个人环境使用 pip 或 pip3,Anaconda Jupyter 可以使用 conda install。
!pip install ffmpeg
排列影片
加载 moviepy 后,使用 clips_array 方法,将多个影片采用“二维数组”的方式分组,排列在同一个画面中呈现 ( 声音会全部重叠在一起 ),下方的程序执行后,会排列出 2x2 的画面。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 使用 Colab 要換路徑使用
from moviepy.editor import *
v1 = VideoFileClip("oxxo1.mp4") # 讀取影片
v2 = VideoFileClip("oxxo2.mp4") # 讀取影片
v3 = VideoFileClip("oxxo3.mp4") # 讀取影片
v4 = VideoFileClip("oxxo4.mp4") # 讀取影片
v1 = v1.resize((480,360)).margin(10) # 改變尺寸,增加邊界
v2 = v2.resize((480,360)).margin(10) # 改變尺寸,增加邊界
v3 = v3.resize((480,360)).margin(10) # 改變尺寸,增加邊界
v4 = v4.resize((480,360)).margin(10) # 改變尺寸,增加邊界
output = clips_array([[v1,v2],[v3,v4]]) # 排列影片,v1 和 v2 一組,v3 和 v4 一組
output.write_videofile("output.mp4",temp_audiofile="temp-audio.m4a", remove_temp=True, codec="libx264", audio_codec="aac")
# 輸出影片,注意後方需要加上參數,不然會沒有聲音
print('ok')
混合影片
使用 moviepy 的 CompositeVideoClip 方法,可以混合多段影片,如果没有设定影片的“遮罩”,则会呈现串列中最后一支影片的画面,而声音则会重叠在一起。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 使用 Colab 要換路徑使用
from moviepy.editor import *
v1 = VideoFileClip("oxxo1.mp4") # 讀取影片
v2 = VideoFileClip("oxxo2.mp4") # 讀取影片
output = CompositeVideoClip([v2,v1]) # 混合影片
output.write_videofile("output.mp4",temp_audiofile="temp-audio.m4a", remove_temp=True, codec="libx264", audio_codec="aac")
# 輸出影片,注意後方需要加上參數,不然會沒有聲音
print('ok')
如果希望混合的影片为“半透明”,可以加载 moviepy.video.fx.all 的特效模组,使用 moviepy 读取影片后,使用 fx 方法中的 mask_color 设定影片遮罩 ( 更多特效方法参考:moviepy.video.fx (vfx) ),就能将某些影片改成半透明进行混合 ( 因为串列中第一支影片做为最下方的背景,因此可以不用设定遮罩 )。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 使用 Colab 要換路徑使用
from moviepy.editor import *
from moviepy.video.fx.all import *
v1 = VideoFileClip("oxxo1.mp4") # 讀取影片
v2 = VideoFileClip("oxxo2.mp4") # 讀取影片
v1 = mask_color(v1,color=0,thr=10,s=0) # 設定 v1 遮罩為半透明
# color=0 表示黑色,thr 和 s 是參數,這種設定為半透明
output = CompositeVideoClip([v2,v1]) # 混合影片
output.write_videofile("output.mp4",temp_audiofile="temp-audio.m4a", remove_temp=True, codec="libx264", audio_codec="aac")
print('ok')
影片淡入淡出转换
如果要做到不同片段间淡入淡出的转场效果,可以额外设定 set_start 起始时间以及 crossfadein 淡入时间,搭配 CompositeVideoClip 混合影片,就能套用“淡入淡出”的效果,组合多张静态图片,下方的范例会将影片剪辑为三段 ( 三秒、四秒和三秒 ),衔接的方式如下图所示:
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 使用 Colab 要換路徑使用
from moviepy.editor import *
video = VideoFileClip("oxxostudio.mp4") # 讀取影片
clip_1 = video.subclip(2,5) # 裁切出三秒影片
clip_2 = video.subclip(17,21).set_start(2).crossfadein(1) # 裁切出四秒影片,設定兩秒後再開始,淡入一秒
clip_3 = video.subclip(50,53).set_start(5).crossfadein(1) # 裁切出三秒影片,設定五秒後再開始,淡入一秒
output = CompositeVideoClip([clip_1,clip_2,clip_3])
output.write_videofile("output.mp4", fps=30, temp_audiofile="temp-audio.m4a", remove_temp=True, codec="libx264", audio_codec="aac")
print('ok')
微信扫码关注
抖音扫码关注