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

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

開放

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,你不需要超能力就能創造出真正神奇的東西。

1
任務
Python SELF TW,  等級 47課堂 2
上鎖
從影片中基礎提取一個幀
從影片中基礎提取一個幀
2
任務
Python SELF TW,  等級 47課堂 2
上鎖
提取和調整多個幀的大小
提取和調整多個幀的大小
3
任務
Python SELF TW,  等級 47課堂 2
上鎖
提取特定頻率的黑白影格
提取特定頻率的黑白影格
4
任務
Python SELF TW,  等級 47課堂 2
上鎖
從提取的幀創建動畫
從提取的幀創建動畫
留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言