1

I am doing a research using raspberry pi. I want to stream video from my raspberry pi (Client) to my laptop (Server) for my project. After two days research i have found following code.

CLIENT

import socket
import cv2
import pickle
import struct

device = cv2.VideoCapture(-1)
ok, frame = device.read()

host = '192.168.1.4'
port = 12345
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host, port))

while True:
    ok, frame = device.read()
    data = pickle.dumps(frame)
    client_socket.sendall(struct.pack("L", len(data)) + data)

    cv2.imshow("",frame)
    if cv2.waitKey(1) == 27:       
        break

device.release()
cv2.destroyAllWindows()

SERVER

import socket
import cv2
import numpy as np
import time
import pickle
import struct

host = '192.168.1.4' 
port = 12345
client_socket = None
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen(5)

conn, addr = server_socket.accept()
data = b''
payload_size = struct.calcsize("L")

while True:
    while len(data) < payload_size:
        #data += conn.recv(90456)
        data += conn.recv(4096)

    packed_msg_size = data[:payload_size]

    data = data[payload_size:]
    msg_size = struct.unpack("L", packed_msg_size)[0]

    while len(data) < msg_size:
        data += conn.recv(4096)

    frame_data = data[:msg_size]
    data = data[msg_size:]

    frame = pickle.loads(frame_data)
    #print (frame.size)

    cv2.imshow('frame', frame)
    cv2.waitKey(1)

But there is a big lag. What i want is live streaming (if possible) or as much as close to live streaming (with minimum lag). Someone could suggest UDP but since it not guarantee that getting all frames.

Can some one suggest me to improve my code. Any help?? Thank you very much in advance!!

iuhettiarachchi
  • 431
  • 1
  • 9
  • 24

0 Answers0