OpenCV VideoWriter写入损坏的视频文件

时间:2020-02-20 11:09:33

标签: python macos opencv video-streaming

我正在尝试使用以下所示的Python脚本从网络摄像头流式传输和保存视频,但是由于某些原因,“ myvideo.mp4”文件的尺寸非常小,无法用QuickTime(或其他播放器)打开-它似乎是空的。但是,视频流可以完美运行。

根据其他主题的建议,我尝试了不同的文件格式和编解码器,并传递了摄像头返回的精确fps,宽度和高度。也许有人知道这里的问题是什么?预先感谢!

import cv2

cap = cv2.VideoCapture(0)

width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
fps = cap.get(cv2.CAP_PROP_FPS)

writer = cv2.VideoWriter('myvideo.mp4',cv2.VideoWriter_fourcc(*'mp4v'),fps,(width,height))

while True:

    ret,frame = cap.read()

    # OPERATIONS (DRAWING)
    writer.write(frame)    
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
writer.release()
cv2.destroyAllWindows()

我也尝试过以超级用户身份运行脚本,但没有帮助。我正在使用Mac。

QuickTime错误:

无法打开文档“ myvideo.mp4”。 该文件与QuickTime Player不兼容。

2 个答案:

答案 0 :(得分:0)

尝试更改fourcc(用于压缩帧的编解码器的4个字符的代码。)

writer = cv2.VideoWriter('myvideo.mp4',cv2.VideoWriter_fourcc(*'mp4v'),fps,(width,height))

替换为

writer = cv2.VideoWriter('myvideo.mp4',cv2.VideoWriter_fourcc(*'XVID'),fps,(width,height))

答案 1 :(得分:0)

只需修正错字

改变

height = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

您服用了两次 CAP_PROP_FRAME_WIDTH

如果问题仍然存在...

如果这仍然没有帮助,请尝试交换它们。这看起来很愚蠢,但对我有帮助。我猜 get 方法以某种方式考虑了方向,但是读取帧会忽略视频的方向(或相反,没关系,它们只是不一致)。我遇到了完全相同的问题,用高度交换了宽度并解决了它。

额外

在 mac 上测试的有点旧 list of codecs