Мне было интересно, возможно ли потоковое воспроизведение данных с использованием класса OpenCV VideoWriter
в Python?
Обычно для обработки данных в памяти, которые в противном случае попадают на диск, я использую 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
в памяти, и если да, то как это делается?
На данный момент у меня нет идей, поэтому любая помощь будет приветствоваться: -)