iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
Software Development

學 Python 到底可以幹麻勒?系列 第 20

( Day 20 ) 影片混合與排列顯示

  • 分享至 

  • xImage
  •  

這篇文章會介紹使用 Python 的 moviepy 第三方函式庫,將多支影片排列在同一個畫面中同時播放,或將多支影片混合成為一支影片 ( 混合聲音或半透明混合 ),以及運用混合的方式,做出不同影片間淡入淡出轉換的效果。

原文參考:影片混合與排列顯示

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

Python 教學 - 影片混合與排列顯示

安裝 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')

Python 教學 - 影片混合與排列顯示

混合影片

使用 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')

Python 教學 - 影片混合與排列顯示

影片淡入淡出轉換

如果要做到不同片段間淡入淡出的轉場效果,可以額外設定 set_start 起始時間以及 crossfadein 淡入時間,搭配 CompositeVideoClip 混合影片,就能套用「淡入淡出」的效果,組合多張靜態圖片,下方的範例會將影片剪輯為三段 ( 三秒、四秒和三秒 ),銜接的方式如下圖所示:

Python 教學 - 影片混合與排列顯示

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')

Python 教學 - 影片截圖、圖片轉影片

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 19 ) 影片剪輯與合併
下一篇
( Day 21 ) 改變影片尺寸、旋轉翻轉影片
系列文
學 Python 到底可以幹麻勒?41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言