我目前使用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'嗎?似乎這裏有東西是腐敗的...... –