CodeGym /Adesua ahorow /Python SELF TW /使用 MoviePy 提取、處理與保存影片中的單幀畫面

使用 MoviePy 提取、處理與保存影片中的單幀畫面

Python SELF TW
等級 47 , 課堂 2
開放

1. 為什麼需要這個?

在我們啟動用於提取畫面的虛擬工具之前,先來聊聊為什麼這很重要。 提取和處理單幀畫面可能對製作特效、分析時間變化,以及為機器學習準備圖像非常有用。 同時這也是利用畫面來製作幻燈片或動畫的一個絕佳方法。

處理畫面的主要步驟

  1. 從影片中提取畫面。
  2. 處理提取的畫面。
  3. 保存處理後的畫面。

現在我們知道了目標,那就開始實踐吧。

2. 從影片提取畫面

我們從最基礎的開始——提取畫面。在 MoviePy 裡,可以輕鬆透過 VideoFileClip 類的 method 訪問影片中的單幀畫面。 每個畫面以陣列(像素的多維陣列)格式表示,可以用 MoviePy 或其他庫(如 NumPyPillow)來處理。

開啟影片並訪問單幀畫面


from moviepy.editor import VideoFileClip

# 開啟影片檔案
video_clip = VideoFileClip("sample_video.mp4")

# 提取第 5 秒的畫面
frame = video_clip.get_frame(5)

# 輸出畫面資訊
print("畫面數據類型:", type(frame))
print("畫面尺寸:", frame.shape)

在這個範例中:

  • VideoFileClip("sample_video.mp4") 開啟影片檔案並創建 video_clip 物件。
  • video_clip.get_frame(5) 提取第 5 秒的畫面。
  • frame.shape 顯示畫面的尺寸(高度、寬度和顏色通道數量)。

3. 以圖像形式保存畫面

在提取畫面後,可以將其保存為圖像。 這可以使用 Pillow(PIL)庫來實現。

安裝 Pillow

若未安裝 Pillow,使用 pip 進行安裝:

pip install pillow

將畫面保存為圖像


from PIL import Image
from moviepy.editor import VideoFileClip

# 開啟影片並提取第 5 秒的畫面
video_clip = VideoFileClip("sample_video.mp4")
frame = video_clip.get_frame(5)

# 將畫面轉換為圖像並保存
image = Image.fromarray(frame)
image.save("frame_at_5_seconds.png")

這裡:

  • Image.fromarray(frame) 將像素陣列轉換為圖像物件。
  • image.save("frame_at_5_seconds.png") 保存畫面為 PNG 文件。

4. 從影片提取多個畫面

如果需要定期提取多個畫面(例如,每幀、每秒或指定間隔),可以使用循環來獲取所需的畫面。 這在需要進行分析或從影片生成縮圖時非常有用。

範例:每秒提取並保存畫面


from PIL import Image
from moviepy.editor import VideoFileClip

# 開啟影片檔案
video_clip = VideoFileClip("sample_video.mp4")

# 影片持續時間(秒)
duration = int(video_clip.duration)

# 每秒提取並保存畫面
for i in range(duration):
    frame = video_clip.get_frame(i)
    image = Image.fromarray(frame)
    image.save(f"frame_{i}_second.png")

這裡:

  • for i in range(duration) 遍歷影片的每一秒。
  • 在每一秒提取畫面,轉換為圖像並按唯一名稱保存(例如,frame_1_second.pngframe_2_second.png)。

5. 保存前調整畫面尺寸

MoviePy 可在保存畫面前調整其尺寸。這對於需要生成縮圖或縮小的畫面的場合非常實用。

調整畫面尺寸並保存


from PIL import Image
from moviepy.editor import VideoFileClip

# 開啟影片檔案
video_clip = VideoFileClip("sample_video.mp4")

# 提取第 10 秒的畫面
frame = video_clip.get_frame(10)

# 將畫面轉換為圖像
image = Image.fromarray(frame)

# 調整畫面尺寸為 200x200 像素
image_resized = image.resize((200, 200))

# 保存調整後的圖像
image_resized.save("resized_frame_at_10_seconds.png")

6. 按特定頻率提取畫面

如果需要按特定頻率提取畫面(例如,每第 10 幀用於運動分析),可以使用幀率參數 fps

範例:提取每第 10 幀


from PIL import Image
from moviepy.editor import VideoFileClip

# 開啟影片檔案
video_clip = VideoFileClip("sample_video.mp4")

# 設置畫面提取間隔(例如,每第 10 幀)
frame_interval = 10

# 提取並保存每第 10 幀
for i, frame in enumerate(video_clip.iter_frames()):
    if i % frame_interval == 0:
        image = Image.fromarray(frame)
        image.save(f"frame_{i}.png")

這裡:

  • video_clip.iter_frames() 允許遍歷影片的所有畫面。
  • if i % frame_interval == 0 僅提取每第 10 幀。

7. 處理畫面

提取畫面只是開始,或許你還想對圖像進行一些魔術變化。 我們可以用 Pillow 庫來處理圖像。


# 將圖像轉換為黑白
image_bw = image.convert("L")
image_bw.save("mid_frame_bw.png")

這裡我們將提取的畫面轉換為黑白圖像。簡單卻很有效的變化,能讓你的畫面更加吸引人。

8. 問題與解決方案

在畫面提取與處理的世界中也有它的挑戰。確保你的系統檔案路徑正確,不然代碼可能變成「大海撈針」。 還有,檢查所有必要的庫和套件是否已安裝,特別是在重啟系統或更新 Python 後。 有時候被遺忘的依賴可能會讓人措手不及。

這個提取和處理畫面的過程在許多領域都極有用。比如製作教學材料、分析體育視頻以進行訓練,或者為視頻剪輯及處理開創性的創意。

一旦熟悉這些技巧,你就能輕鬆將任何影片分解為單幀畫面,然後隨心所欲地處理它們!告別無聊和枯燥——你的新工具箱為你帶來了一個充滿可能性的世界。 記住,有了 MoviePy,你不需要超能力就能創造出真正神奇的東西。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION