Like Share Discussion Bookmark Smile

J.J. Huang   2026-01-12   Python OpenCV 02.入門篇:基礎操作   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 影片輸出與編碼

📚 前言

在前一章我們學會了如何讀取與播放影片。
這一篇要進一步學習 影片輸出與編碼,理解如何將影格序列寫成影片檔案。

範例影片

  • 載點:video.zip
  • 來源:此影片取自 Pexels,屬於無版權影片,可自由下載與使用。
  • 內容:影片呈現一個程式編輯畫面,長度約 2 秒,適合作為 OpenCV 測試範例。

💾 使用 VideoWriter 輸出影片

OpenCV 提供 cv2.VideoWriter() 來輸出影片。官方文件

語法:

1
out = cv2.VideoWriter(filename, fourcc, fps, frame_size, isColor)
  • filename:輸出檔案名稱與路徑。
  • fourcc:編碼器代碼,例如 cv2.VideoWriter_fourcc(*'XVID')
  • fps:每秒影格數。
  • frame_size:影片解析度 (寬, 高)。
  • isColor:布林值,True 表示彩色,False 表示灰階。

🔑 常見編碼器 (fourcc)

編碼器 代碼 常見格式 建議用途
XVID cv2.VideoWriter_fourcc(*'XVID') AVI 舊版 AVI,兼容性一般,適合基本測試
MP4V cv2.VideoWriter_fourcc(*'MP4V') MP4 跨平台常用,適合一般影片輸出
MJPG cv2.VideoWriter_fourcc(*'MJPG') Motion JPEG 支援度高,適合快速測試與除錯

👉 不同平台支援度不同,需測試。

🛠️ 範例一:讀取影片並輸出灰階影片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import cv2

cap = cv2.VideoCapture("video.mp4")

# 取得影片的大小與 FPS
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

fourcc = cv2.VideoWriter_fourcc(*'MJPG') # 改用 MJPG 編碼器
out = cv2.VideoWriter("output_gray.avi", fourcc, fps, (width, height), False)

while True:
ret, frame = cap.read()
if not ret:
break

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
out.write(gray) # 寫入灰階影格

cv2.imshow("Gray", gray)
if cv2.waitKey(1) == ord('q'):
break

cap.release()
out.release()
cv2.destroyAllWindows()


圖:將彩色影片轉換為灰階並輸出

⚠️ 常見問題與排查

在使用 cv2.VideoWriter() 時,常見的問題點如下:

  • frame size 不一致:初始化 VideoWriter 時指定的 (width, height) 必須和輸入影格大小完全一致,否則會寫入失敗。
  • 灰階 vs 彩色:若 isColor=False,必須傳入單通道灰階影格;若傳入彩色影格會造成錯誤。
  • 編碼器支援度:不同平台對編碼器支援度不同,例如 XVID 在部分環境下可能無法正確輸出灰階影片,建議改用 MJPGMP4V
  • FFmpeg/codec 缺失:部分環境可能缺少對應的編碼器,導致輸出檔案損壞或無法播放。
  • 播放問題:即使成功輸出,若播放器不支援對應編碼器,影片仍可能無法播放。若仍遇到問題,建議嘗試不同編碼器並確認播放器支援度。

👉 建議先測試 MJPG 編碼器,並確認 frame size 與輸入影格一致,通常能解決大部分問題。

🛠️ 範例二:用 NumPy 生成動畫影片

1
2
3
4
5
6
7
8
9
10
11
12
import cv2
import numpy as np

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter("moving_square.avi", fourcc, 20, (500, 500))

for i in range(100):
frame = np.zeros((500, 500, 3), dtype="uint8")
cv2.rectangle(frame, (50+i, 200), (150+i, 300), (0, 0, 255), -1)
out.write(frame)

out.release()

👉 這樣就能生成一段「紅色方塊水平移動」的動畫影片。


圖:使用 NumPy 生成動畫影片

⚠️ 注意事項

  • FPS 與 frame_size:必須和輸入影格一致,否則影片可能無法正確播放。
  • 顏色通道:OpenCV 預設是 BGR。
  • 資源釋放:記得呼叫 out.release(),避免檔案損壞。
  • 編碼器支援度:不同平台支援度不同,需測試。
  • 跨平台差異:Windows、macOS、Linux 對編碼器支援度不同,需測試。

結語 🎯

這一篇我們學會了如何使用 cv2.VideoWriter() 輸出影片,並理解了編碼器、FPS、解析度等關鍵參數。
下一篇將進一步學習 圖片屬性與資訊查詢,掌握圖片處理的更多技巧。


註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials
Pexels