[英]How to save video capture in mp4 format with opencv python
伙计们,我正在使用以下代码使用 opencv 和 python 捕获桌面视频:
import numpy as np
import cv2
from mss import mss
from PIL import Image
bounding_box = {'top': 100, 'left': 0, 'width': 400, 'height': 300}
sct = mss()
while True:
sct_img = sct.grab(bounding_box)
cv2.imshow('screen', np.array(sct_img))
if(cv2.waitKey(1) & 0xFF) == ord('q'):
cv2.destroyAllWindows()
break
我希望能够以 mp4 格式保存此捕获,我该怎么做?
它应该像这样工作。
import numpy as np
import cv2
from mss import mss
from PIL import Image
bounding_box = {'top': 100, 'left': 0, 'width': 400, 'height': 300}
sct = mss()
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (640,480))
while True:
sct_img = sct.grab(bounding_box)
out.write(np.array(sct_img))
cv2.imshow('screen', np.array(sct_img))
if(cv2.waitKey(1) & 0xFF) == ord('q'):
cv2.destroyAllWindows()
break
官方文档在Getting Started with Videos中展示了示例
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
frame = cv.flip(frame, 0)
# write the flipped frame
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()
首先,您必须使用 4 个字符的代码设置编解码器。 有带有代码的页面fourcc.org 。
不同的系统可能使用不同的编解码器——主要是DIVX
、 XVID
、 MJPG
、 X264
、 WMV1
、 WMV2
。
fourcc = cv.VideoWriter_fourcc(*'XVID')
接下来,您必须设置文件名和扩展名、 FPS
、宽度、高度
out = cv.VideoWriter('output.avi', fourcc, 20.0, (400, 300))
某些编解码器不适用于某些扩展 - 您可能需要检查不同的组合( .avi
、 .mp4
、 .mkv
、 .mov
等)
如果图像有400x300
而你想要视频800x600
然后设置VideoWriter(..., (800, 600))
但你还必须在写入之前调整每一帧的大小因为VideoWriter
不会自动调整它的大小 - 它跳过帧(没有错误)并且最后它创建空文件(~4kb)。
frame = cv2.resize(frame, (800, 600))
out.write(frame)
VideoWriter(.., 20.0, ...)
设置20 FPS
(每秒帧数),但它不是写入速度,而是视频播放器必须以多快的速度显示它的信息。
如果您每秒创建 20 帧,那么播放器将以正确的速度显示它。 如果您每秒创建 10 帧,那么播放器的显示速度将提高 2 倍。 如果你每秒创建 40 帧,那么播放器将以一半的速度显示它。
它使用程序FFMPEG ,您可以看到在系统控制台/终端中运行的编解码器列表
ffmpeg -codecs
或在源代码中(带有 4 个字符的代码)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.