2017-09-01 72 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