Как я сегодня усвоил, 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)