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