Exemplo n.º 1
0
    def onClick(self, pressed):

        if pressed:
            print('Started server')
            self.sender().setText("STOP SERVER")

            # The grabber of the webcam
            grabber = video_grabber.VideoGrabber(jpeg_quality, encoder)
            grabber.start()
            get_message = lambda: grabber.get_buffer()

            keep_running = True

            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

            port = int(self.textbox.text())

            # Bind the socket to the port
            server_address = (host, port)

            print('starting up on %s port %s\n' % server_address)

            sock.bind(server_address)

            ipAddr = socket.gethostbyname(socket.gethostname())

            print("Server IP: ", ipAddr)

            frame_idx = 0

            while (keep_running):
                data, address = sock.recvfrom(4)
                data = data.decode('utf-8')
                if (data == "get"):
                    bufferRaw = get_message()
                    buffer = b64encode(bufferRaw)
                    frame_idx += 1
                    # print("Rec: ", data, " Frame: ", str(frame_idx), " Buff size", len(buffer), " b64: ", buffer[0], buffer[1], buffer[2],
                    #      bufferRaw[0], bufferRaw[1], bufferRaw[2], type(buffer))

                    if buffer is None:
                        continue
                    if len(buffer) > 65507:
                        print(
                            "The message is too large to be sent within a single UDP datagram. We do not handle splitting the message in multiple datagrams")
                        sock.sendto("FAIL".encode('utf-8'), address)
                        continue
                    # We send back the buffer to the client
                    sock.sendto(buffer, address)
                elif (data == "quit"):
                    grabber.stop()
                    keep_running = False

            print("Quitting..")
            grabber.join()
            sock.close()

        else:
            print('Disconnected')
            self.sender().setText("START SERVER")
    "--encoder",
    type=str,
    choices=["cv2", "turbo"],
    help="Which library to use to encode/decode in JPEG the images",
    default="cv2",
)

args = parser.parse_args()

jpeg_quality = args.jpeg_quality
host = "127.0.0.1"
port = args.port
encoder = args.encoder

# The grabber of the webcam
grabber = video_grabber.VideoGrabber(jpeg_quality, encoder)
grabber.start()
get_message = lambda: grabber.get_buffer()

keep_running = True

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Bind the socket to the port
server_address = (host, port)

print("starting up on %s port %s\n" % server_address)

sock.bind(server_address)
while keep_running:
    data, address = sock.recvfrom(4)
encoder = args.encoder

# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.settimeout(2.0)
host = args.host
port = args.port
server_address = (host, port)
# sock.bind(('127.0.0.1', 5000))

t0 = time.time()
frame_idx = 0
iter = 0

grabber = video_grabber.VideoGrabber(jpeg_quality)
grabber.start()
get_message = lambda: grabber.get_buffer()

while (True):
    iter += 1
    buffer = get_message()
    if buffer is None:
        continue
    if len(buffer) > 65507:
        print(
            "The message is too large to be sent within a single UDP datagram. We do not handle splitting the message in multiple datagrams"
        )
        sock.sendto("FAIL".encode('utf-8'), server_address)

        continue
port = args.port
jpeg_quality = args.jpeg_quality
resize_factor = args.resize

cv2.namedWindow("Image")

keep_running = True

jpeg_handler = utils.make_jpeg_handler(args.encoder, jpeg_quality)

if args.image is not None:
    grabber = None
    img = cv2.imread(args.image, cv2.IMREAD_UNCHANGED)
    get_buffer = functools.partial(jpeg_handler.compress, cv2_img=img)
else:
    grabber = video_grabber.VideoGrabber(jpeg_quality, args.encoder,
                                         resize_factor)
    grabber.start()
    get_buffer = grabber.get_buffer

# img = cv2.imread("monarch.png", cv2.IMREAD_UNCHANGED)
# get_buffer = lambda: utils.encode_image(img, jpeg, jpeg_quality)

# A temporary buffer in which the received data will be copied
# this prevents creating a new buffer all the time
tmp_buf = bytearray(7)
# this allows to get a reference to a slice of tmp_buf
tmp_view = memoryview(tmp_buf)

# Creates a temporary buffer which can hold the largest image we can transmit
img_buf = bytearray(9999999)
img_view = memoryview(img_buf)