Перенаправить фрагменты видеоданных из сокета в opencv для реконструкции видео

Я попытался использовать документацию pycam 3.13. Запись в сетевой поток, где клиентом является камера pycam, которая отправляет видео H.264 через сокет, а сервер постепенно считывает файлоподобный объект и перенаправляет данные в видео. игрок. Код работает из коробки.

Клиентская сторона из приведенного выше примера кажется мне идеальным решением, так как я использую pizero для захвата видео, и этот подход отправляет данные без какой-либо дополнительной обработки на стороне передатчика. Таким образом, клиент постоянно отправляет данные:

camera.start_recording(socket_connection, format='h264')
while(True):
  # break
camera.stop_recording

С другой стороны, получатель считывает данные через сокет из файлового объекта и отправляет поток данных в проигрыватель:

# server reads data from file-like object
connection = server_socket.accept()[0].makefile('rb')
cmdline = ['mplayer', '-fps', '25', '-cache', '1024', '-']
player = subprocess.Popen(cmdline, stdin=subprocess.PIPE)
while True:
    # Repeatedly read 1k of data from the connection and write it to
    # the media player's stdin
    data = connection.read(1024)
    if not data:
        break
    player.stdin.write(data)

Плеер умеет декодировать видео из полученных данных, но если я хочу сохранить видео в файл и/или обработать/изменить его размер на стороне получателя, мне нужно знать, как восстановить кадры.

Конечная цель состоит в том, чтобы получить данные видеопотока, а затем сохранить их в стандартный видеофайл, одновременно уменьшая размер видео и передавая его дальше по сети. Я нашел много решений, таких как это, и учебные пособия, такие как это о том, как отправлять/получать видео с помощью opencv, но я не могу понять, как настроить их для моего конкретного случая. Насколько я понимаю, cv2.VideoCapture() может захватывать только с камеры или файла. Но поскольку у меня есть непрерывный видеопоток, который я получаю кусками по 1024 байта (как в приведенном выше примере),

  1. Как я могу перенаправить эти фрагменты данных в функции opencv, то есть cv2.VideoCapture(), для захвата и обработки видео?
  2. Есть ли другой способ реконструировать видео, предполагая, что сторона передатчика остается неизменной?

person Nazar    schedule 13.06.2021    source источник