Ошибка Python при отправке изображения через сокет с рассолом - PullRequest
1 голос
/ 23 марта 2019

Я создаю программу, которая отправляет видеопоток через сокет, и я использую 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()
...