iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0
Software Development

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

( Day 25 ) 影片截圖、圖片轉影片

  • 分享至 

  • xImage
  •  

這篇文章會介紹使用 Python 的 moviepy 第三方函式庫,將影片進行單張圖片的截圖 ( 擷取某個影格儲存為圖片 ),以及將單張圖片或 gif 動畫圖片轉換成影片。

原文參考:影片截圖、圖片轉影片

本篇使用的 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 讀取影片後,使用 save_frame 方法,就能將指定時間的影格,儲存為圖片 ( 支援 jpg、png ),下方的程式碼執行後,會擷取 20 秒、20.1 秒和 20.2 秒三張圖片。

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

from moviepy.editor import *
video = VideoFileClip("oxxostudio.mp4")
frame = video.save_frame("frame1.jpg", t = 22)
frame = video.save_frame("frame2.jpg", t = 22.1)
frame = video.save_frame("frame3.jpg", t = 22.2)
print('ok')

單張圖片轉影片

使用 ImageClip 方法搭配 set_duration,可以讀取單張圖片,並將其轉換成指定秒數的影片,需要注意的是,因為單張圖片沒有 fps ( 一秒幾格 ),所以輸出時要額外設定 fps。

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

from moviepy.editor import *
img_clip = ImageClip("oxxostudio.jpg", transparent=True).set_duration(2)
img_clip.write_videofile("output.mp4",fps=30, 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 *

img1 = ImageClip("oxxo1.jpg", transparent=True).set_duration(3)
img2 = ImageClip("oxxo2.jpg", transparent=True).set_duration(4).set_start(2).crossfadein(1)
img3 = ImageClip("oxxo3.jpg", transparent=True).set_duration(3).set_start(5).crossfadein(1)

output = CompositeVideoClip([img1,img2,img3])

output.write_videofile("output.mp4",fps=30, temp_audiofile="temp-audio.m4a", remove_temp=True, codec="libx264", audio_codec="aac")
print('ok')

組合的原理如下圖所示,img1 有三秒,img2 四秒,img3 三秒,總長度八秒。

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

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

gif 圖片轉影片

使用讀取影片的 VideoFileClip 方法開啟 gif 動畫,再使用 write_videofile 方法,就能將 gif 動畫圖檔轉換成影片。

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

from moviepy.editor import *
video = VideoFileClip("oxxostudio.gif")
video.write_videofile("output.mp4",temp_audiofile="temp-audio.m4a", remove_temp=True, codec="libx264", audio_codec="aac")
print('ok')

更多 Python 教學

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


上一篇
( Day 24 ) 影片轉換為 gif 動畫
下一篇
( Day 26 ) 下載 Youtube 影片 ( mp4、mp3、字幕 )
系列文
學 Python 到底可以幹麻勒?41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言