我想知道是否有可能在Python语言中使用OpenCV VideoWriter
类来“流式”传输数据?
通常,在处理内存中的数据时,我使用BytesIO (或StringIO)。
不过,我尝试使用BytesIO失败了:
import cv2
from io import BytesIO
stream = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc('x264')
data = BytesIO()
# added these to try to make data appear more like a string
data.name = 'stream.{}'.format('av1')
data.__str__ = lambda x: x.name
try:
video = cv2.VideoWriter(data, fourcc=fourcc, fps=30., frameSize=(640, 480))
start = data.tell()
# Check if camera opened successfully
if (stream.isOpened() == False):
print("Unable to read camera feed", file=sys.stderr)
exit(1)
# record loop
while True:
_, frame = stream.read()
video.write(frame)
data.seek(start)
# do stuff with frame bytes
# ...
data.seek(start)
finally:
try:
video.release()
except:
pass
finally:
stream.release()
但是,我没有编写BytesIO
对象,而是得到了以下消息:
Traceback (most recent call last):
File "video_server.py", line 54, in talk_to_client
video = cv2.VideoWriter(data, fourcc=fourcc, fps=fps, frameSize=(width, height))
TypeError: Required argument 'apiPreference' (pos 2) not found
..。因此,当我将VideoWriter调用修改为cv2.VideoWriter(data, apiPreference=0, fourcc=fourcc, fps=30., frameSize=(640, 480))
(我读到0表示自动,但我也尝试了cv2.CAP_FFMPEG
)时,我得到了以下错误:
Traceback (most recent call last):
File "video_server.py", line 54, in talk_to_client
video = cv2.VideoWriter(data, apiPreference=0, fourcc=fourcc, fps=fps, frameSize=(width, height))
TypeError: bad argument type for built-in operation
所以我的问题是,可以在内存中使用cv2.VideoWriter
类编写编码视频吗?如果可以,是如何实现的?
在这一点上,我没有什么想法,所以任何帮助都将是最受欢迎的:-)
发布于 2018-06-27 07:23:48
不幸的是,OpenCV不支持对内存进行编码(或解码)。您必须向磁盘写入(或从磁盘读取),VideoWriter (或VideoCapture)才能工作。
发布于 2021-11-01 05:37:29
如果您使用Linux,您可以创建一个ramdisk并对其进行写操作。
mount -t tmpfs -o size=512m tmpfs /mnt/ramdisk
https://stackoverflow.com/questions/51052268
复制相似问题