OpenCV Python VideoWriter 保存损坏的视频
OpenCV Python VideoWriter saves corrupted video
我试图在开始修改视频帧之前获得一个复制视频的非常简单的示例。但是,与 2.8 mb barriers.avi 视频相比,output.avi 视频是一个 5kb 的损坏文件。我正在使用 OpenCV 版本 4.2.0 和 Python 版本 3.7.7.
代码如下:
import cv2
input = cv2.VideoCapture("../video/barriers.avi")
height = int(input.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(input.get(cv2.CAP_PROP_FRAME_WIDTH))
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('../video/output5.avi', fourcc, 30, (height, width), isColor=True)
while input.isOpened():
# get validity boolean and current frame
ret, frame = input.read()
# if valid tag is false, loop back to start
if not ret:
break
else:
out.write(frame)
input.release()
out.release()
如果我打印框架形状,我得到:
(480, 640, 3)
注意:None 的其他堆栈溢出解决方案有所帮助。
编辑:如果使用 cv2.imshow(),所有帧都可以正常显示。
我想解决您代码中的两个问题:
问题#1::您想创建一个 .avi
视频文件。因此,您需要将 fourcc 初始化为 MJPG
:
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
创建视频文件有一定的组合。例如,如果你想创建一个 .mp4
你初始化你的 fourcc 为 *'mp4v'
.
问题#2: 确保输出视频的大小与输入帧的大小相同。例如:您声明了您的 Videowriter 对象大小 (height, width)
。那么你的相框一定要一样大:
frame = cv2.resize(frame, (height, width))
代码:
import cv2
cap = cv2.VideoCapture("output.mp4")
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output5.avi', fourcc, 30, (width, height), isColor=True)
while cap.isOpened():
# get validity boolean and current frame
ret, frame = cap.read()
# if valid tag is false, loop back to start
if not ret:
break
else:
frame = cv2.resize(frame, (width, height))
out.write(frame)
cap.release()
out.release()
我试图在开始修改视频帧之前获得一个复制视频的非常简单的示例。但是,与 2.8 mb barriers.avi 视频相比,output.avi 视频是一个 5kb 的损坏文件。我正在使用 OpenCV 版本 4.2.0 和 Python 版本 3.7.7.
代码如下:
import cv2
input = cv2.VideoCapture("../video/barriers.avi")
height = int(input.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(input.get(cv2.CAP_PROP_FRAME_WIDTH))
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('../video/output5.avi', fourcc, 30, (height, width), isColor=True)
while input.isOpened():
# get validity boolean and current frame
ret, frame = input.read()
# if valid tag is false, loop back to start
if not ret:
break
else:
out.write(frame)
input.release()
out.release()
如果我打印框架形状,我得到:
(480, 640, 3)
注意:None 的其他堆栈溢出解决方案有所帮助。
编辑:如果使用 cv2.imshow(),所有帧都可以正常显示。
我想解决您代码中的两个问题:
问题#1::您想创建一个 .avi
视频文件。因此,您需要将 fourcc 初始化为 MJPG
:
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
创建视频文件有一定的组合。例如,如果你想创建一个 .mp4
你初始化你的 fourcc 为 *'mp4v'
.
问题#2: 确保输出视频的大小与输入帧的大小相同。例如:您声明了您的 Videowriter 对象大小 (height, width)
。那么你的相框一定要一样大:
frame = cv2.resize(frame, (height, width))
代码:
import cv2
cap = cv2.VideoCapture("output.mp4")
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output5.avi', fourcc, 30, (width, height), isColor=True)
while cap.isOpened():
# get validity boolean and current frame
ret, frame = cap.read()
# if valid tag is false, loop back to start
if not ret:
break
else:
frame = cv2.resize(frame, (width, height))
out.write(frame)
cap.release()
out.release()