📢 公告:OpenCV 系列文章目前正在重構整理中,部分文章已暫時下架,後續會陸續補上,完成時間待定。感謝耐心等候!

Like Share Discussion Bookmark Smile

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

Python | OpenCV 影片輸出與編碼

📚 前言

在上一篇 影片讀取與播放 中,我們學會了如何使用 cv2.VideoCapture() 讀取與播放影片。
這一篇要進一步學習 影片輸出與編碼,理解如何將影格序列寫成影片檔案。

🎨 範例影片

  • 來源:Pexels,屬於無版權影片,可自由下載與使用。
  • 內容:影片呈現一個終端機畫面,長度約 2 秒,適合作為 OpenCV 測試範例。
  • 下載後將檔名改為 sample.mp4,放到專案的 assets/ 目錄下。

💾 使用 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
28
# write_video_gray.py
import cv2

cap = cv2.VideoCapture("assets/sample.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/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
13
# write_video_animation.py
import cv2
import numpy as np

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter("output/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、解析度等關鍵參數。
下一篇進入 圖片屬性與資訊查詢,掌握圖片處理的更多技巧。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。


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