在Mac OS X上使用Python和OpenCV2无法编写视频

4
我正在使用mac os x 1.7.5,Python 2.7.5_1和OpenCV 2.4.4_0,这些都是通过macports安装的。我似乎已经安装了所有最新的依赖端口。
在我的代码中,成功创建并打开了cv2.Videowriter(),它生成了一个6kb的.avi文件,但videoFile.write(img0)没有将任何内容写入该文件。我真的无法弄清楚为什么视频流没有被写入文件。有什么见解吗?
我的代码如下:
import cv2
import cv

cv2.namedWindow("Original")

cap0 = cv2.VideoCapture(0) 

codec = cv.CV_FOURCC('D','I','V','X')
print codec

videoFile = cv2.VideoWriter();
videoFile.open('video.avi', codec, 25, (640, 480),1)

key = -1
while(key < 0):
    success0, img0 = cap0.read()

    cv2.imshow("Original", img0)

    videoFile.write(img0)

    key = cv2.waitKey(1)
cv2.destroyAllWindows()

我已经尝试了这些编解码器,但都无法正常工作:I420、AVC1、YUV1、PIM1、MJPG、MP42、MP4V、DIV3、DIVX、XVID、IUYV、FFV1、FLV1、U263、H264、ZLIB。
我还查看了所有此处提到的快速时间编解码器
使用ZLIB编解码器时,我遇到了错误:
[zlib @ 0x7fb0d130a000] Specified pixel format yuv420p is invalid or not supported

使用H264编解码器时出现错误:
[libx264 @ 0x7fe423869600] broken ffmpeg default settings detected
[libx264 @ 0x7fe423869600] use an encoding preset (e.g. -vpre medium)
[libx264 @ 0x7fe423869600] preset usage: -vpre <speed> -vpre <profile>
[libx264 @ 0x7fe423869600] speed presets are listed in x264 --help
[libx264 @ 0x7fe423869600] profile is optional; x264 defaults to high

我不理解上述错误的含义。我尝试重新安装ffmpeg到最新版本(1.2.2_0+gpl2),但我的脚本仍然无法工作。所有其他编解码器都没有出现任何错误。
我甚至尝试了使用以上编解码器的.mpg和.mkv文件扩展名。有时会出现错误,说编解码器不适用于该文件扩展名,但当我没有出现错误时,我只会得到一个微小的无法读取的视频文件。
非常感谢任何帮助。
PS:我已经阅读了以下SO问题,但没有解决我的问题:
3个回答

5
问题似乎出在函数videoFile.open('video.avi', codec, 25, (640, 480),1)中的图像大小。因此,我更新了我的脚本以包括。
size = (int(cap0.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),
        int(cap0.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))

然后相应地将videoFile.open更改为

videoFile.open('video.avi', codec, 25, size,1)

然后我的脚本开始工作了。
我已经尝试了四cc编解码器:IYUV、I420、PIM1、MJPG、FFV1和DIVX,文件扩展名为.avi。
以上每种编解码器都可以使用帧速率16、20、25和30,除了PIM1似乎只能在20fps及以上工作。
此外,
  • 使用fourcc THEO的编解码器可以使用文件扩展名.ogv
  • XVID可以正确地使用文件扩展名.mkv,虽然.mkv容器应该可以与任何编码一起使用,但我得到了各种奇怪的结果。
  • 使用文件扩展名.flv的FLV1无法工作。它给出错误:

    [flv @ 0x7f8414006000] Tag FLV1/0x31564c46 incompatible with output codec id '22' ([2][0][0][0])

  • 使用文件扩展名.flv的FLV4没有出现错误,但是opencv的videowrite输出了一个错误"Could not update video file"

在可以与.avi文件容器一起使用的编解码器中,DIVX生成了最小的视频文件(4秒视频约为4Mb),而IYUV生成了最大的文件(4秒视频约为160Mb)。

注意:

  • fps = videoCapture.get(cv2.cv.CV_CAP_PROP_FPS)从网络摄像头捕获时总是返回0.0。这是OpenCV2.4.3和OpenCV2.4.4中的一个错误。
  • 我还发现ffmpeg不能像从Windows和Ubuntu那样从Mac的iSight和FacetimeHD网络摄像头中获取图像,因为苹果的设计师禁止轻松访问Mac的相机...真可惜!

参考资料:

http://en.wikipedia.org/wiki/Comparison_of_container_formats


1

起初我得到了一个0kb的视频文件。我将编解码器从MJPG更改为iYUV。这对我有用。Python 2.7和openCV 2.4.5。

cap = cv2.VideoCapture(0)
fourCC = cv2.cv.CV_FOURCC('i','Y','U', 'V'); # Important to notice cv2.cv.CV_FOURCC
size = (int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),   int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
out = cv2.VideoWriter("Test.avi", fourCC, 15.0, size, True)

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接