我目前使用OpenCV来读取视频帧。发送视频帧到客户端
在服务器端序列化使用cPickle.dumps()帧:
flag, frame = cap.read()
frame = cPickle.dumps(frame)
client_socket.sendall(frame)
在客户端序列化使用cPickle.loads()帧:
data = sock.recv(4000)
frame = cPickle.loads(data) # ValueError: insecure string pickle
self.ImageLabel.configure(image=frame) # Want to show the frame in Tkinter
self.ImageLabel.image = frame
self.ImageLabel.grid(row=4, columnspan=40)
cPickle的。加载(数据)导致ValueError:不安全的字符串pickle。我究竟做错了什么?我想读取客户端的框架并在tkinter窗口中显示它。我查了9个多小时,但找不到解决方案。
编辑1:
我也尝试这样的:
服务器侧
flag, frame = cap.read()
if flag:
size = sys.getsizeof(frame)
client_socket.send(str(size))
client_socket.sendall(cPickle.dumps(frame.tolist()))
客户端
size = sock.recv(4000)
data = sock.recv(int(size))
frame = cPickle.loads(data) # Causes EOFError
编辑2: 服务器侧
flag, frame = cap.read()
if flag:
frame = cPickle.dumps(frame)
size = len(frame)
p = struct.pack("I", size)
client_socket.send(p)
client_socket.sendall(frame)
客户端
sizep = sock.recv(struct.calcsize("I"))
data_size = struct.unpack("I",sizep)
print type (data_size) # tuple - has (11026730,)
data = sock.recv(int(data_size[0]))
frame = cPickle.loads(data) # ValueError: insecure string pickle
@让FrançoisFabrecap.read( )是OpenCV的一项功能。它给一个对象 –
@ Jean-FrançoisFabrecPickle.dumps(frame.tolist())在尝试cPickle.load(data)时会导致EOFError。 我不确定self.ImageLabel.configure(image = frame)是否接受一个ndarray。 –
你可以在发送之前打印'frame'吗?似乎这里有东西是腐败的...... –