[ MoviePy ] 利用MoviePy將影片加入音訊

由於 OpenCV是視覺處理的 Library,很自然它並沒有處理音訊的部分,所以生成出來的影片是沒有聲音的。
雖然拿 Twice的影片當作 OpenCV練習的素材滿有趣的,但看著沒有音樂的 MV也挺枯燥的。
因此特地找了 MoviePy這個 Library。
MoviePy是用於視頻編輯的 Library,可用於基本操作(如剪切、連接、標題插入),視頻合成(非線性編輯),視頻處理或創建高級效果。它可以讀取和寫入最常見的視頻格式,也包含 GIF。
接著就把 Opencv輸出,但沒有音頻的影片加入音樂吧。
from moviepy.editor import VideoFileClip

clip1 = VideoFileClip("twice_jelly_jelly.mp4")
audioclip1 = clip1.audio
clip2 = VideoFileClip("face_twice_jelly_jelly.avi")

new_video = clip2.set_audio(audioclip1)
# audioclip1.write_audiofile("twice_jelly_jelly.mp3")  # 如果想要輸出 mp3
new_video.write_videofile("face_twice_jelly_jelly_audio.mp4")


再來介紹一個比較有趣的,網路上常會有人製作 GIF動畫貼在各大論壇。

MoviePy同樣也能輕鬆地製作這些 GIF動畫。
import moviepy.editor as mpy

clip = mpy.VideoFileClip("spcial_video_tzuyu.mp4")
subclip = clip.subclip(14.9,16.7)  # 從第幾秒開始到第幾秒結束
subclip = subclip.resize(0.2)      # 長寬皆乘上 0.2來縮小尺寸。

subclip.write_gif("try.gif")
Resize共有下面四種方法
myClip.resize( (460,720) )          # New resolution: (460,720)
myClip.resize(0.6)                  # width and heigth multiplied by 0.6
myClip.resize(width=800)            # height computed automatically.
myClip.resize(lambda t : 1+0.02*t)  # slow swelling of the clip
上面的 GIF就是來自下面的 YouTube影片透過以上代碼得到的。編輯時使用的是 1080p畫質。


如果是透過連續的圖片,則需要
import moviepy.editor as mpy
import glob
import cv2

img_list = glob.glob('./twice/*.png')
img_list.sort(key= lambda num: int(num.split("/")[-1].split(".")[0]))

img_cv = []
for img in img_list:
    im = cv2.imread(img)
    img_cv.append(im)

img_cv = img_cv[0:100]  # 選擇第幾張圖片到第幾張

clip = mpy.ImageSequenceClip(img_cv, fps=12)  # 需要輸入 fps設定 gif播放的速度
clip.write_gif("try.gif")
clip.write_videofile("try.mp4")  # 若要輸出 mp4

*** import moviepy.editor的時候可能會跳出下面的訊息
...
imageio.core.fetching.NeedDownloadError: Need ffmpeg exe. You can download it by calling:
imageio.plugins.ffmpeg.download()
只要進到 python shell中,輸入下列指令就能下載缺少的部份。
>>> import imageio
>>> imageio.plugins.ffmpeg.download()

MoviePy功能非常強大,本篇只有提到本人目前需要的部分,未來需求有增加才會再增加篇幅吧。
對 MoviePy有興趣的朋友歡迎拜訪 MoviePy官網

留言