【问题标题】:cv2.VideoWriter with cap from video filecv2.VideoWriter,带有视频文件的上限
【发布时间】:2020-07-27 08:18:17
【问题描述】:

在通过 'cv2' 保存视频文件期间,我遇到了一个奇怪的问题。如果从网络摄像头进行视频捕获,则此代码运行良好,但如果从文件(例如 cap = cv2.VideoCapture("test.avi"))捕获视频,则会形成一个没有任何流的空文件。

import cv2
cap = cv2.VideoCapture(0)

cap.set(cv2.CAP_PROP_FRAME_WIDTH, w)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, h)

out = cv2.VideoWriter('output.avi',cv2.VideoWriter_fourcc('M','J','P','G'), fps, (w, h))

while cap.isOpened():
    ret, frame = cap.read()
    out.write(frame)

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

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

我尝试更改输入视频文件的格式,例如 .avi、.ts 和输出,但没有任何改变

谁知道我为什么会遇到这个问题?

【问题讨论】:

  • 你可以看看下面的post。我的答案的第一部分生成了一个合成的 AVI 视频文件。第二部分从创建的视频文件中捕获帧。 1. 按原样执行代码。 2.cv2.CAP_OPENCV_MJPEG 替换为cv2.CAP_FFMPEG3. 编辑您的帖子以从文件中捕获帧。 4. 我建议您在编辑后的帖子中包含构建合成视频的部分。

标签: python-3.x opencv


【解决方案1】:

您是否尝试打印 cam.isOpened() 输出?您的可用相机可能使用不同于 0 的变量进行初始化。

试试cap = cv2.VideoCapture(-1)。除此之外,您是否在 Linux 上运行它?确保你安装了 ffmpeg。

【讨论】:

  • 我从网络摄像头写入没有问题,效果很好,我从像这样的文件写入 cv2.VideoCapture("test.avi") 有问题,当然 imshow 函数可以很好地显示帧.
【解决方案2】:

好的,一段时间后我发现了问题。这部分打扰我完成视频:

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

在我删除“break”之后,一切都变得正常了。也许是因为,与从相机接收到的流不同,来自视频文件的流是有限的,我的中断阻止了最终确定。

【讨论】:

  • 您无需在此处删除break。您应该在ret 上添加检查。 if ret == False 退出循环。
猜你喜欢
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2017-08-11
  • 1970-01-01
  • 2020-07-30
  • 2020-05-19
  • 2019-04-09
相关资源
最近更新 更多