2011-03-24 92 views
6

當我試圖將幀寫入視頻時,我不斷收到斷言錯誤。我得到的錯誤是這樣的:使用OpenCV + Python + Mac編寫視頻

Traceback (most recent call last): 
    File "VideoMixer.py", line 23, in <module> 
    cv.WriteFrame(writer, cv.LoadImage(fileName)) 
cv.error: dst.data == dst0.data 

這裏是我的腳本:

import cv 
import sys 

files = sys.argv[1:] 

for f in files: 
    capture = cv.CaptureFromFile(f) 
    height = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH) 
    width = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT) 
    fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS) 
    fourcc = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FOURCC) 
    print fourcc 
    writer = cv.CreateVideoWriter('ok.mov', int(fourcc),fps,(int(width),int(height)),1) 
    print writer 
    for i in range(30): 
     frame = cv.QueryFrame(capture) 
     print frame 
     if frame: 
      cv.WriteFrame(writer, frame) 

保存幀作爲圖像正常工作,所以我知道有沒有錯捕獲。我創作的作家是錯的嗎? '打印fourcc'輸出0.0,但我已經嘗試了許多FOUR_CC值。

謝謝!

回答

6

做一些你的幀有不同的顏色空間或深度?幾點意見:

  • 你已經交換了代碼中的高度和寬度,這是故意的嗎?
  • 您的fourcc應該是一個> 0的整數。請參閱下面的示例。

我沒有親自生成QuickTime視頻使用OpenCV,但這工作生成一個未壓縮的AVI文件。我選擇使用cv.CV_FOURCC功能I420 FOURCC:

import cv 
import sys 

# standard RGB png file 
path = 'stack.png' 
cap = cv.CaptureFromFile(path) 
fps = 24 
width = int(cv.GetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_WIDTH)) 
height = int(cv.GetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_HEIGHT)) 
# uncompressed YUV 4:2:0 chroma subsampled 
fourcc = cv.CV_FOURCC('I','4','2','0') 
writer = cv.CreateVideoWriter('out.avi', fourcc, fps, (width, height), 1) 
for i in range(90): 
    cv.GrabFrame(cap) 
    frame = cv.RetrieveFrame(cap) 
    cv.WriteFrame(writer, frame) 

更新:VLC的抓屏打out.avi

enter image description here

在QuickTime:

enter image description here

+2

非常感謝,但你可以玩out.avi?這個腳本運行良好並生成文件,但當我嘗試播放時,VLC給了我一個錯誤:ps error:can not peek main debug:沒有可以加載匹配「avi」的demux模塊 main debug:TIMER module_need() :303.765 ms - 總計303.765 ms/1 intvls(平均303.765 ms) 主要錯誤:沒有合適的demux模塊用於'file /:///Users/***/Documents/Code/Video/out.avi' – rgbrgb 2011-03-25 06:27:14

+0

I can播放該文件,我在Mac上使用最新的VLC。我會用screencap更新我的答案。 – samplebias 2011-03-25 15:46:24

+0

我還能夠使用[AviDemux](http://avidemux.sourceforge.net/)和Quicktime打開並播放out.avi文件。 – samplebias 2011-03-25 18:28:36

4

我嘗試過各種編解碼器包括「MJPG」和「I420」他們都不在我的Mac OpenCV的工作建立。他們無怨無悔地製作了微小的不可查看的輸出文件。

然後我發現this page列出了一些編解碼器,爲我工作。例如。 'mp4v'在我的Mac上正常工作,QuickTime可以播放它。

+1

@mtoosi,你把文件保存爲什麼文件擴展名?我嘗試了'codec = cv.CV_FOURCC('M','P','4','V')'並將文件保存爲'/ full/path/to/file/out。mp4v'產生一個有效的文件,但不是在QuickTime或VLC中打開的文件。 – cooncesean 2012-12-06 07:24:05

+0

@cooncesean,我在所有情況下使用'.avi'作爲文件擴展名IIRC。另外,我使用的是OS X 10.8,並且自己構建了OpenCV 2.4.3,其中包含所有默認標誌,且系統上未安裝任何第三方庫。 – mtoossi 2012-12-06 17:23:05

+0

僅供參考我在OS X 10.11上使用OpenCV 2.4.13.2,並且能夠使用'cv2.cv.CV_FOURCC('M','P','4','V')'和'輸出文件名的擴展名爲「.avi」。 '.mp4'的擴展產生了一個單幀而不運動的視頻。 – trianta2 2017-04-07 20:35:47