【问题标题】:Unable to write video using python and opencv2 on mac os x无法在 mac os x 上使用 python 和 opencv2 编写视频
【发布时间】:2013-09-21 01:41:47
【问题描述】:

我正在使用 mac os x 1.7.5,通过 macports 安装了 python 2.7.5_1 和 opencv 2.4.4_0。我似乎拥有所有最新的依赖端口。

在我的代码中,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

quick time codecs mentioned here@

使用 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 问题:

【问题讨论】:

    标签: python macos opencv video


    【解决方案1】:

    要让 h264 正常工作,请从以下链接安装 ffmpeg。这是一个相当麻烦的安装,但它会让编码器启动并运行。

    https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

    【讨论】:

      【解决方案2】:

      最初我得到一个 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)
      

      【讨论】:

        【解决方案3】:

        问题似乎出在函数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)
        

        然后我的脚本开始工作。

        我尝试过使用fourcc 的编解码器: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 输出错误“无法更新视频文件”

        在使用 .avi 文件容器的编解码器中,DIVX 生成的视频文件最小(约 4Mb 用于 4 秒视频),IYUV 生成最大文件(约 160Mb 用于 4 秒视频)

        注意:

        • fps = videoCapture.get(cv2.cv.CV_CAP_PROP_FPS) 从网络摄像头捕获时始终返回 0.0。这是 OpenCV2.4.3 和 OpenCV2.4.4 中的一个 bug
        • 我还发现 ffmpeg 无法像从 Windows 和 Ubuntu 那样从 Mac 的 iSight 和 FacetimeHD 网络摄像头抓取图像,因为 Apple 的设计人员禁止轻松访问 Mac 的摄像头……真可惜!

        参考资料:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-22
          • 1970-01-01
          • 2011-06-15
          • 2011-09-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多