需要恒定大小的类型以通过套接字作为非恒定数据的标头发送

时间:2019-05-06 22:54:46

标签: python sockets protocols

正如我今天所学的很难一样,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)

1 个答案:

答案 0 :(得分:0)

事实证明,实际上 帧是恒定大小的,所以现在这行就够了。 buff = sock.recv(921664)