1. 為什麼需要這個?
在我們啟動用於提取畫面的虛擬工具之前,先來聊聊為什麼這很重要。 提取和處理單幀畫面可能對製作特效、分析時間變化,以及為機器學習準備圖像非常有用。 同時這也是利用畫面來製作幻燈片或動畫的一個絕佳方法。
處理畫面的主要步驟
- 從影片中提取畫面。
- 處理提取的畫面。
- 保存處理後的畫面。
現在我們知道了目標,那就開始實踐吧。
2. 從影片提取畫面
我們從最基礎的開始——提取畫面。在 MoviePy 裡,可以輕鬆透過 VideoFileClip
類的 method 訪問影片中的單幀畫面。
每個畫面以陣列(像素的多維陣列)格式表示,可以用 MoviePy 或其他庫(如 NumPy 或 Pillow)來處理。
開啟影片並訪問單幀畫面
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.png
、frame_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,你不需要超能力就能創造出真正神奇的東西。
GO TO FULL VERSION