Я создаю программу, которая отправляет видеопоток через сокет, и я использую pickle для загрузки / выгрузки массива изображений. Я быстро отправляю снимки, чтобы быстро получать кадры и делать из них живое видео. Когда я пытаюсь это сделать, я получаю ошибку _pickle.UnpicklingError: неверный ключ загрузки, '<'. </em>
Я пытался постоянно загружать массив в pickle (pickle.loads) и использовать cv2 для открытия кадра, но через несколько кадров выдает ошибку _pickle.UnpicklingError: неверный ключ загрузки, '<' . </em>
Server.py (основное внимание уделяется send_commands ())
import os
import time
import socket
import sys
import threading
import cv2
import numpy as np
import pickle
loggedin = 1
all_addresses = []
all_connections = []
def socket_create():
if loggedin == 0:
return
try:
global host
global port
global s
host = ''
port = 9999
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as e:
print("Socket error > " + str(e))
return
def socket_bind():
try:
global host
global port
global s
host = ''
print("Socket binding - Port > " + str(port))
print(host + str(port))
s.bind((host, int(port)))
s.listen(1)
except socket.error as e:
print("Socket binding - Error > " + str(e))
time.sleep(3)
socket_bind()
def accept_connections():
for c in all_connections:
c.close()
del all_connections[:]
del all_addresses[:]
while True:
try:
conn, address = s.accept()
conn.setblocking(1)
all_connections.append(conn)
all_addresses.append(address)
print("\nC - IP > " + str(address[0]))
except socket.error as e:
print("Error: " + str(e))
time.sleep(3)
time.sleep(1)
def send_commands():
print("send")
time.sleep(2)
conn = all_connections[0]
conn.send(str.encode("#Video"))
while True:
p = conn.recv(40960000)
data_arr = pickle.loads(p, fix_imports=True, encoding="bytes")
frame = cv2.cvtColor(data_arr, cv2.COLOR_RGB2BGR)
cv2.imshow("frame", frame)
print("go")
cv2.waitKey(10)
def go():
socket_create()
socket_bind()
a = threading.Thread(name='background', target=accept_connections)
a.start()
send_commands()
go()
Client.py (основное внимание уделяется img ())
import threading
import time
import os
import sys
import socket
import pyscreenshot
import pickle
import numpy as np
from PIL import ImageGrab
host = "192.168.1.27"
port = 9999
def go():
global s
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, int(port)))
while True:
data = s.recv(40960000)
if data.decode("utf-8") != "#Video":
return
while True:
img()
print("img")
except:
print("Error")
time.sleep(2)
def img():
img = ImageGrab.grab()
img_np = np.array(img)
data_string = pickle.dumps(img_np)
s.sendall(data_string)
if __name__ == '__main__':
go()