Как передавать данные в реальном времени в экземпляр ec2?

#python #amazon-web-services #sockets #amazon-ec2 #real-time

#python #amazon-веб-сервисы #сокеты #amazon-ec2 #в режиме реального времени

Вопрос:

Весь процесс можно описать следующими шагами —

  1. Отправить кадр изображения в экземпляр EC2
  2. Фрейм процесса
  3. Отправьте его обратно клиенту

Я использовал программирование сокетов, открыл порт и передал на него данные.Этот метод очень медленный, в среднем требуется 0,7 секунды для отправки фрейма и 1,2 секунды для передачи с сервера на клиент.Ниже приведен фрагмент кода, который я использовал :

Клиент: считывает фрейм, передает на сервер, затем получает обработанный фрейм обратно и отображает его

   ret,frame = cap.read()
  data = pickle.dumps(frame) # Serialising data
  message_size = struct.pack("L", len(data))
  clientsocket.sendall(message_size   data) #Sending frame

  
  #Receiving frame
  while len(recv_data) < payload_size:
    recv_data  = clientsocket.recv(8192)

  packed_msg_size = recv_data[:payload_size]
  recv_data            = recv_data[payload_size:]
  msg_size        = struct.unpack("L", packed_msg_size)[0]

  while len(recv_data) < msg_size:
    recv_data  = clientsocket.recv(8192)


  frame_data = recv_data[:msg_size]
  new_frame = pickle.loads(frame_data)
  recv_data       = recv_data[msg_size:]

  #Displaying received data
  cv2.namedWindow("output", cv2.WINDOW_NORMAL)     
  cv2.imshow("output", new_frame)
  
 

Сервер: получает фрейм, обрабатывает его, отправляет обработанный фрейм обратно клиенту

 while True:

  while len(data) < payload_size:
    data  = conn.recv(4096)

  packed_msg_size = data[:payload_size]
  data            = data[payload_size:]
  msg_size        = struct.unpack("L", packed_msg_size)[0]

  while len(data) < msg_size:
    data  = conn.recv(4096)


  frame_data = data[:msg_size]
  data       = data[msg_size:]

  frame      = pickle.loads(frame_data)
  #Processing frame


  new_frame      = pickle.dumps(frame)
  #Data received
  message_size = struct.pack("L",len(new_frame))
  #Sending data back
  conn.sendall(message_size   new_frame)
 

Этот метод очень медленный, необходимо передавать данные в режиме реального времени.

Комментарии:

1. Вы видели этот документ, он подходит? docs.aws.amazon.com/streams/latest/dev /…

2. @OleksiiDonoha Вы знаете, как я могу подключить веб-камеру к производителю потока Kinesis?

3. Насколько велики кадры в каждом направлении? Вы ожидаете, что будете работать с одним кадром за раз, как подразумевает код? Большинство подобных кодов будут иметь скользящее окно из многих кадров, чтобы помочь с задержкой в сети.

4. @AnonCoward , размер кадра равен 640×480. После передачи кадров я хочу запустить модель глубокого обучения на экземпляре EC2, которая работает с одним кадром. Я попробовал KinesisVideo stream, но есть задержка в 2 секунды. Интересно, как работают веб-сайты для видеоконференций, им также необходимо передавать кадры с клиента на сервер в режиме реального времени

5. Программное обеспечение для видеоконференцсвязи не нуждается в передаче данных в режиме реального времени, есть задержка. Они также сжимают видео и отправляют поток видеоданных, они не отправляют по одному кадру за раз и ждут ответа другой стороны перед отправкой следующего. Предполагая, что вы пытаетесь отправить 640×480 в несжатом виде даже со скоростью 5 кадров в секунду, вам потребуется пропускная способность для загрузки 35 Мбит / с, что кажется маловероятным.