CREATE LIVE STREAMING VIDEO CHAT APP WITHOUT VOICE USING CV2 MODULE OF PYTHON
4 min readJun 5, 2021
NETWORK SOCKET
* A network socket is a software structure within a network node of a computer network that serves as an endpoint for sending and receiving data across the network.
- The structure and properties of a socket are defined by an application programming interface (API) for the networking architecture.
|| IMPLEMENTATION OF SOCKETS
In Standard Internet Protocols like TCP and UDP :
* socket address is the combination of
socket address = ( IP address , port number)
|| CLIENT-SERVER MODEL
- Server creates socket on startup
- May serve several clients concurrently
- A client should know the server IP and port
PRE-REQUITIES :
-> Install following modules in cmd ::* pip install OpenCV-python
* pip install sockets
* pip install pickle-mixin.
* pip install supyr-struct
|| PYTHON SERVER MODULE
- Socket creation
SYNTAX : server_socket = socket.socket(socket.AF_INET , socket.SOCK_DGRAM)CODE :
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host_name = socket.gethostname()
host_ip = socket.gethostbyname(host_name)
print('HOST IP:',host_ip)
port = 10050
socket_address = (host_ip,port)
2. Socket bind
SYNTAX : server_socket.bind((host_ip , port))CODE :
server_socket.bind(socket_address)
3. Socket listen
SYNTAX : server_socket.listen(5) #5 is backlogCODE :
server_socket.listen(5)
print("LISTENING AT:",socket_address)
4. Socket accept
SYNTAX : client_socket , addr = server_socket.accept()CODE :
while True:
client_socket,addr = server_socket.accept()
print('GOT CONNECTION FROM:',addr)
if client_socket:
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
ret,vdo = cap.read()
vdo = imutils.resize(vdo,width=320)
a = pickle.dumps(vdo)
message = struct.pack("Q",len(a))+a
client_socket.sendall(message)
cv2.imshow('TRANSMITTING VIDEO',vdo)
key = cv2.waitKey(1) & 0xFF
if key ==ord('q'):
client_socket.close()
5. Socket client
client_socket.recv() or client_socket.send() or client_socket.sendall()
6. Close client
client_socket.close
| VIDEO DATA TRANSMISSION : At Server Side ::
- With Open CV get video frames of webcam
- With PICKLE serialize frame to byte data
- Pack each frame data using STRUCT module
- Send data to client and display frame
FINAL SERVER CODE :
OUTPUT :
|| PYTHON CLIENT MODULE
- Socket creation
SYNTAX : client_socket = socket.socket(socket.AF_INET , socket.SOCK_STREAM)CODE :
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host_ip = '169.254.72.59' # paste your HOST IP
port = 10050
2. Socket connect
SYNTAX : client_socket.connect(( host_ip , port ))CODE :
client_socket.connect((host_ip,port)) # tuple
data = b"" # Initialise data variable as a string , b - bytes# Payload size is defined with "Q" i.e.,unsigned long long integer that takes 8 bytes
payload_size = struct.calcsize("Q")
3. Socket receive
SYNTAX : packet = client_socket.recv(1024) #1024 is buffer sizeCODE :
while True:
while len(data) < payload_size:
# when we recieve packet we use 4k buffer
packet = client_socket.recv(4*1024)
if not packet: break
data+=packet
# First 8 bytes contain size of packed msg so we use data from 0 to payload_size(i.e., 8)
packed_msg_size = data[:payload_size]
# Rest of the data contains video so we set new data which we have to frame to display
data = data[payload_size:]
msg_size = struct.unpack("Q",packed_msg_size)[0]
while len(data) < msg_size:
data += client_socket.recv(4*1024)
# We will get the packed msg size and run the while loop until we receive all data from the client socket for frame
frame_data = data[:msg_size]
data = data[msg_size:]
# Finally, frame data is recovered
frame = pickle.loads(frame_data)
cv2.imshow("RECEIVING VIDEO",frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'): # q is used to quit the video
break
client_socket.close()
4. Socket send
client_socket.send(packet)
5. Close socket
client_socket.close()
| VIDEO DATA TRANSMISSION : At Client Side ::
- Receive packets and append them to data
- Unpack the data using STRUCT module
- Load the frame using PICKLE
- Display the frame at client side
FINAL CLIENT CODE :
OUTPUT :
FINAL OUTPUT ::
- Note: since I done in same pc I get same image