【问题标题】:Writing video with OpenCV + Python + Mac使用 OpenCV + Python + Mac 编写视频
【发布时间】:2011-07-22 13:10:57
【问题描述】:

当我尝试将帧写入视频时,我不断收到断言错误。我得到的错误是这样的:

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)

将帧保存为图像效果很好,所以我知道捕获没有问题。我创造作家错了吗? 'printfourcc' 输出 0.0,但我尝试了许多 FOUR_CC 值。

谢谢!

【问题讨论】:

    标签: python video opencv video-encoding


    【解决方案1】:

    您的某些框架是否有不同的色彩空间或深度?一些观察:

    • 您在代码中交换了高度和宽度,这是故意的吗?
    • 您的fourcc 应该是> 0 的整数。请参见下面的示例。

    我没有亲自使用 OpenCV 生成 Quicktime 视频,但这对我生成未压缩的 AVI 文件很有用。我选择使用cv.CV_FOURCC函数的I420fourcc:

    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的截图:

    在 Quicktime 中:

    【讨论】:

    • 非常感谢,但您能播放 out.avi 吗?该脚本对我来说运行良好并生成文件,但是当我尝试播放它时 VLC 给了我一个错误:ps 错误:无法查看主调试:无法加载与“avi”匹配的解复用模块主调试:TIMER module_need():303.765 ms - 总计 303.765 ms / 1 intvls(平均 303.765 ms)主要错误:没有适合 `file/:///Users/***/Documents/Code/Video/out.avi' 的解复用模块
    • 我可以播放文件,我在 Mac 上使用最新的 VLC。我会用屏幕截图更新我的答案。
    • 我还能够使用AviDemux 和 Quicktime 打开并播放 out.avi 文件。
    • 嗯也无法让 AviDemux 工作。我认为 out.avi 已损坏,因为无论我尝试制作多少帧,文件都是 8kb。您使用的是 Quicktime 还是 ffmpeg?我正在使用quicktime,所以也许这就是问题所在。再次感谢您的帮助。
    【解决方案2】:

    This file in the OpenCV source 在第 #2598 行暗示 - 如果此断言失败:“dst.data == dst0.data”

    表示目标大小或类型不正确

    【讨论】:

      【解决方案3】:

      我尝试了各种编解码器,包括“MJPG”和“I420”,但它们都不适用于我的 Mac OpenCV 构建。他们毫无怨言地生成了无法查看的微小输出文件。

      然后我找到了this page,其中列出了一些对我有用的编解码器。例如。 “mp4v”在我的 Mac 上运行良好,QuickTime 也可以播放。

      【讨论】:

      • @mtoosi,您将文件保存为什么文件扩展名?我尝试了codec = cv.CV_FOURCC('M','P','4','V') 并将文件另存为/full/path/to/file/out.mp4v,它生成了一个有效文件,但不是在 QuickTime 或 VLC 中打开的文件。
      • @cooncesean,在所有情况下,我都使用 .avi 作为文件扩展名 IIRC。另外,我在 OS X 10.8 上使用所有默认标志自己构建了 OpenCV 2.4.3,系统上没有安装第三方库。
      • 仅供参考,我在 OS X 10.11 上使用 OpenCV 2.4.13.2,我能够使用 cv2.cv.CV_FOURCC('M','P','4','V') 和扩展名为 .avi 的输出文件名来完成这项工作。 .mp4 的扩展产生了一个单帧无运动的视频。
      • 在 OS X 10.14.5 上使用 OpenCV 4.1.0,cv2.VideoWriter_fourcc(*"MP4V") 对我有用,但前提是我将文件设为 .mp4。如果我尝试.avi,QuickTime 不会播放它。
      猜你喜欢
      • 2015-08-11
      • 2018-03-10
      • 1970-01-01
      • 2013-01-23
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多