Я хочу потоковое видео (используется PiCamera) с Python3. Мне нужно добавить некоторые метаданные для каждого кадра, а затем прочитать все метаданные на стороне клиента. Тип метаданных является dict. например, mean=129.2
У меня есть потоковое видео с picamera.capture_continuous
, но было предоставлено низкое FPS, около 8. Поэтому я использую функцию picamera.start_recording
, которая возвращает поток байтов в формате MJPEG
.
Я использую базовую реализацию видео в байтовом потоке.
class StreamingOutput(object):
def __init__(self):
self.frame = None
self.frame_buffer = io.BytesIO()
self.meta = None
self.meta_buffer = io.BytesIO()
self.condition = Condition()
def write(self, buf):
if buf.startswith(b'\xff\xd8'): # new frame
self.frame_buffer.truncate()
with self.condition:
self.frame = self.frame_buffer.getvalue()
self.condition.notify_all()
self.frame_buffer.seek(0)
self.frame_buffer.write(buf)
Я запутался в том, как добавить к этому метаданные. Я попытался выбрать начальные и конечные байтовые блоки, но поток сокетов смешал их, например, некоторые данные изображения, затем метаданные, а затем другую часть данных изображения.
Программа чтения видео на стороне клиента:
while True:
buffer += sock.recv(7372800)
sock.send(b"gg")
try:
frame_start = buffer.find(b'\xff\xd8')
frame_end = buffer.find(b'\xff\xd9')
if frame_start != -1 or frame_end != -1:
binary_frame = buffer[frame_start:frame_end + 2]
if len(binary_frame) < 1000: continue
encoded_frame = numpy.frombuffer(binary_frame, dtype=numpy.uint8)
frame = cv.imdecode(encoded_frame, cv.IMREAD_COLOR)
except Exception as exc:
print(exc)