OpenCV VideoWriter写入的视频文件损坏。

3

我正在尝试使用以下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 不兼容。


这里是一份编解码器列表。但说实话,我用它们都没有什么好运气。 - hans
2个回答

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上测试过一些有点老旧的编解码器列表


0
尝试更改fourcc(用于压缩帧的编解码器的四字代码)。
writer = cv2.VideoWriter('myvideo.mp4',cv2.VideoWriter_fourcc(*'mp4v'),fps,(width,height))

替换它为

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

2
这是我尝试的第一个编解码器,但它出现了错误:OpenCV:FFMPEG:标签0x44495658/'XVID'与编解码器ID 12和格式'mp4 / MP4(MPEG-4 Part 14)'不兼容。 - Nick Foley
尝试将文件保留为myvideo.avi。 - spaceman

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