Потоковое видео Python с пользовательскими метаданными для каждого кадра - PullRequest
0 голосов
/ 03 октября 2019

Я хочу потоковое видео (используется 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)
...