【发布时间】:2021-03-23 10:02:18
【问题描述】:
为了通过套接字发送 numpy 数组(图像),我使用了 pickle,但有时它会显示“_pickle.UnpicklingError:pickle 数据被截断”,我找到了一些修复方法,但它们没有起作用,原因有一个:我正在发送每次可能的数组,因为我正在制作一个屏幕共享脚本,解决方案是放置一个循环,将部分 msg 组合起来。并且由于我在每次运行 while 循环时都发送数组,因此它将所有数组组合在一起。我该怎么办?
服务器:
import cv2
import numpy
import pyautogui
import pickle
import time
import socket
a = pickle.dumps(numpy.array([4556]))
print (a)
b = pickle.loads(a)
print(b)
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((socket.gethostname(), 3948))
server.listen()
client, addres = server.accept()
print("listening")
while True:
screen = pyautogui.screenshot()
cv2thing = numpy.array(screen)
rgb = cv2thing[...,::-1].copy()
client.send(pickle.dumps(rgb))
print("sent")
if cv2.waitKey(1) == ord('q'):
break
客户:
import socket
import cv2
import pickle
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((socket.gethostname(), 3948))
print("connected")
while True:
cv2.imshow('frame', pickle.loads(client.recv(999999999)))
if cv2.waitKey(1) == ord('q'):
cv2.destroyAllWindows()
break
【问题讨论】:
-
你没有使用
sendall();无法保证send()发送所有内容。 -
通过网络发送未压缩的 RGB 屏幕抓图效率非常低... iMac Pro 的 RGB 全屏抓图为 43MB,因此您将在千兆以太网上每秒获得 2 帧。您可能希望在发送前编码为 PNG 或 JPEG。
标签: python arrays numpy sockets python-sockets