Нужен тип постоянного размера для отправки через сокеты в качестве заголовка для непостоянных данных - PullRequest
0 голосов
/ 07 мая 2019

Как я сегодня усвоил, Python не имеет стандартизированной ширины типов.Целое число может быть 20 байтов здесь и 30 байтов там.Это представляет проблему, так как я пытаюсь отправить видеопоток через сокеты.Каждый кадр имеет разный размер, поэтому я решил рассчитать размер каждого кадра и отправить его до кадра, чтобы принимающая программа знала, чего ожидать, но, поскольку типы Python не имеют постоянного размера, это не сработает.

Я пытался использовать библиотеку типов c, но я не верю, что это то, что мне нужно, потому что для отправки через сокет необходимо, чтобы это были байты.(Получено через str(x).encode(), я полагаю.)

cameraServer.py

import cv2
import sys
import socket

host = ''
port = 4001
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

print("Preparing webcam.")
vid = cv2.VideoCapture(0)
empty, frame = vid.read()
print("Webcam ready, waiting for client connection.")

sock.bind((host, port))
sock.listen(3)
conn, addr = sock.accept()
print(addr, " connected, sending first frame size.")
conn.send(str(sys.getsizeof(cv2.imencode('.jpg', frame)[1].tostring())).encode())

while True:
    if vid.isOpened():
        empty, frame = vid.read()
        data = cv2.imencode('.jpg', frame)[1].tostring()

        conn.send(str(sys.getsizeof(data)).encode())
        conn.send(data)

cameraClient.py

import socket
import cv2
import numpy as np

ip = "localhost"
port = 4001
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(3)

sock.connect((ip, port))

buff = sock.recv(24)
print("First frame size received! ", buff.decode(), "\n")

while True:
    frameSize = sock.recv(16)

    buff = sock.recv(int(frameSize.decode()))

    nparr = np.frombuffer(buff, np.uint8)
    newFrame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    cv2.imshow("s", newFrame)

1 Ответ

0 голосов
/ 07 мая 2019

Оказывается, что кадры на самом деле имеют постоянного размера, так что теперь эта строка - все, что нужно. buff = sock.recv(921664)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...