OpenCV VideoWriter write() 函数在 C++ 中的 MAC OS 上失败

OpenCV VideoWriter write() function fails on MAC OS in C++

我是新手。我正在研究 OpenCV。我正在尝试使用 OpenCV 读写视频文件。我的代码是:

VideoCapture inputVideo("input.avi");

    if (!inputVideo.isOpened())
    {
        std::cout << "!!! Input video could not be opened" << std::endl;
        return -1;
    }

    // Setup output video
    VideoWriter output_cap("output.avi",
                               inputVideo.get(CV_CAP_PROP_FOURCC),
                               inputVideo.get(CV_CAP_PROP_FPS),
                               cv::Size(inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT)),1);

    Mat frame;

    output_cap.open("/private/var/root/Desktop/output.avi",
                    inputVideo.get(CV_CAP_PROP_FOURCC),
                    inputVideo.get(CV_CAP_PROP_FPS),
                    cv::Size(inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT)),1);
    while (true)
    {
        if (!inputVideo.read(frame))
            break;

        imshow("title",frame);

        waitKey(100);
        output_cap.write(frame);
    }

现在我的问题是:当我尝试使用 output_cap.write(frame) 编写帧时,我的输出视频文件只有 8kb 文件。但是用于查看框架的 imshow("title",frame) 函数工作正常并按顺序查看所有框架。你能告诉我我做错了什么吗?

mac os x 没有 videoWriter。您可以将它们保存为 jpeg,然后使用 ffmpeg 拼接它们。

如果您使用 brew 安装了 OpenCV,请尝试使用 brew install opencv --with-ffpmeg 重新安装它。

我使用其他 fourcc 代码解决了它:8BPS 和 SVQ3。

我遇到了类似的问题。当我尝试使用 mac 的网络摄像头录制视频时

imshow("title",frame)

查看框架的功能工作正常。但是当我尝试使用

编写框架时

output_cap.write(frame)

我只有 8kb(正好 414 字节)的文件作为我的输出视频文件。

我试了很多方法都没有用。终于安装了ffmpeg,还是不行

但是当我在终端中输入 ffmpeg -codecs 时,我看到了 "QuickTime video"。然后我去了 fourcc.org 并查找 "Quicktime"。我得到了:8BPS、AVRN、RPZA、SV10、SVQ3 和 ZYGO。

我都试过了,只有两个有效:8BPS和SVQ3。

我的代码是:

import cv2 
import time

filename = time.strftime("%m-%d-%H-%M-%S") + '.avi' 
cap = cv2.VideoCapture(0) 
cap.set(3, 640) 
cap.set(4, 480)

size = (int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),
        int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))

fps = 16

fourcc  = cv2.cv.FOURCC('X', 'V', 'I', 'D')     #does not work 
fourcc0 = cv2.cv.FOURCC('D', 'I', 'V', 'X')     #does not work 
fourcc1 = cv2.cv.FOURCC('M', 'J', 'P', 'G')     #does not work 
fourcc2 = cv2.cv.FOURCC('8', 'B', 'P', 'S')     #works, large 
fourcc3 = cv2.cv.FOURCC('A', 'V', 'R', 'N')     #does not work 
fourcc4 = cv2.cv.FOURCC('R', 'P', 'Z', 'A')     #does not work 
fourcc5 = cv2.cv.FOURCC('S', 'V', '1', '0')     #does not work 
fourcc6 = cv2.cv.FOURCC('S', 'V', 'Q', '3')     #works, small 
fourcc7 = cv2.cv.FOURCC('Z', 'Y', 'G', 'O')     #does not work

out = cv2.VideoWriter(filename, fourcc6, fps, size, True)
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        out.write(frame)
        cv2.imshow('frame', frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break;

    else:
        print 'Error...'
        break;

cap.release() 
out.release() 
cv2.destroyAllWindows()