iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0

這篇文章會介紹使用 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 函式庫後,使用 subclip 方法,參數填入起始秒數以及結束秒數,就可以剪輯影片,剪輯後再透過 write_videofile 方法輸出。

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # 使用 Colab 要換路徑使用

from moviepy.editor import *
video = VideoFileClip("oxxostudio.mp4")  # 讀取影片
output = video.subclip(12,15)                 # 剪輯影片 ( 單位秒 )
output.write_videofile("output_1.mp4",temp_audiofile="temp-audio.m4a", remove_temp=True, codec="libx264", audio_codec="aac")
# 輸出影片,注意後方需要加上參數,不然會沒有聲音
print('ok')

合併影片

如果有多段影片,可使用 concatenate_videoclips 的方法,將多段影片拼接在一起。

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # 使用 Colab 要換路徑使用

from moviepy.editor import *
o1 = VideoFileClip("oxxo1.mp4")                    # 開啟第一段影片
o2 = VideoFileClip("oxxo2.mp4")                    # 開啟第二段影片
o3 = VideoFileClip("oxxo3.mp4")                    # 開啟第三段影片
output = concatenate_videoclips([o1, o2, o3])      # 合併影片
output.write_videofile("output123.mp4",temp_audiofile="temp-audio.m4a", remove_temp=True, codec="libx264", audio_codec="aac")
print('ok')

如果合併的影片,出現播不出來的狀況 ( 畫面是亂碼 ),表示合併了不同尺寸的影片所導致。

Python 教學 - 影片剪輯與合併

解決方法有兩種,第一種使用 resize 將尺寸調整為一致,合併後影像就不會出現亂碼。

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # 使用 Colab 要換路徑使用

from moviepy.editor import *
o1 = VideoFileClip("oxxo1.mp4")
o1 = o1.resize((1280,720))      # 改變尺寸
o2 = VideoFileClip("oxxo2.mp4")
o3 = VideoFileClip("oxxo3.mp4")
output = concatenate_videoclips([o1, o2, o3])
output.write_videofile("output456.mp4", fps=30, temp_audiofile="temp-audio.m4a", remove_temp=True, codec="libx264", audio_codec="aac")
print('ok')

第二種方法可以設定 concatenate_videoclips 的參數 method 為 compose ( 預設為 chain,表示都要同樣大小 ),表示採用原始影片大小進行合併,最終輸出大小會採用最大的影片為主

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # 使用 Colab 要換路徑使用

from moviepy.editor import *
o1 = VideoFileClip("oxxo1.mp4")
o2 = VideoFileClip("oxxo2.mp4")
o3 = VideoFileClip("oxxo3.mp4")
output = concatenate_videoclips([o1, o2, o3], method='compose')   # 設定 method 為 compose
output.write_videofile("output456.mp4", fps=30, temp_audiofile="temp-audio.m4a", remove_temp=True, codec="libx264", audio_codec="aac")
print('ok')

更多 Python 教學

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


上一篇
( Day 18 ) 取出影片聲音、影片加入聲音
下一篇
( Day 20 ) 影片混合與排列顯示
系列文
學 Python 到底可以幹麻勒?41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言