2017-09-01 98 views
1

我想在視頻文件上疊加一些傳感器信息(時間序列)。我認爲Python和OpenCV會是一個不錯的方法,並開始學習基礎知識,所以我決定製作我能想到的最簡單的玩具示例:加載視頻並逐幀複製。逐幀複製視頻時沒有視頻輸出

這是我的代碼:

import cv2 

src = cv2.VideoCapture('input.mp4') 
if not src.isOpened(): 
    print("Error opening src") 
    quit() 

width = int(src.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)) 
height = int(src.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)) 
fps = src.get(cv2.cv.CV_CAP_PROP_FPS) 

fourcc = cv2.cv.CV_FOURCC(*'XVID') 
dest = cv2.VideoWriter('output.avi', fourcc, fps, (height, width)) 
if not dest.isOpened(): 
    print("Error opening dest") 
    quit() 

ret, frame = src.read() 
while ret: 
    dest.write(frame) 
    ret, frame = src.read() 

dest.release() 
src.release() 
  • 預計:作爲一個XviD格式文件output.avi
  • input.mp4完全相同的副本觀察output.avi是一個5.6 KB的文件,這顯然只包含一個AVI頭。它不能通過mplayer複製,也不能通過cv2.VideoCapture閱讀。

這是我的設置:

  • 的Debian GNU/Linux的9
  • 的Python 2.7.13
  • cv.__version__返回 '2.4.9.1'
  • FFmpeg的3.2.5-1

對於可重複性,這裏有一個命令行來下載一個非常短的YouTube視頻youtube-dl

youtube-dl 'https://www.youtube.com/watch?v=RfkcI8dhfsQ' -o input.mp4 
+0

'read'是否真的成功? –

+0

我這麼認爲。循環執行51次。 (關於我在我的問題中列出的示例YouTube視頻) – giusti

+0

我現在已經閱讀了Open CV 2x與FFmpeg 3x不兼容的建議,但我不知道如何確認這與我的情況是否相關。 – giusti

回答

1

在這一行應該(width,height)(height, width)

dest = cv2.VideoWriter('output.avi', fourcc, fps, (height, width)) 

VideoWriter必須具有的大小你寫否則它不工作的權利的框架相同。

+0

謝謝!猜猜我受到'frame.shape()'返回'(高度,寬度,深度)'的欺騙。 – giusti

+0

@giusti是的,我不知道他們爲什麼做那個高度,寬度。這隻會讓人們感到困惑。 – ROAR