正如我今天所学的很难一样,Python没有标准化的类型宽度。整数可以是20个字节,而此处是30个字节。由于我试图通过套接字发送视频流,所以这带来了一个问题。每个帧的大小都不同,因此我决定计算每个帧的大小,然后在该帧之前发送该大小,以便接收程序知道期望的大小,但是由于Python的类型不是固定大小的,因此无法使用。 / p>
我尝试使用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)
答案 0 :(得分:0)
事实证明,实际上 帧是恒定大小的,所以现在这行就够了。
buff = sock.recv(921664)