I am new to python, and I was asked to do a streaming to an ip address by getting the frames from a socket locally.
I managed to create socket that sends frames captured by OpenCV and send it to clients
This is the code for client:
import cv2
import socket
import sys
import pickle
import struct
PORT = 5050
SERVER = "127.0.0.1"
ADDR = (SERVER, PORT)
clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect(ADDR)
data = b'' ### CHANGED
payload_size = struct.calcsize("L") ### CHANGED
while True:
# Retrieve message size
while len(data) < payload_size:
data += clientsocket.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0] ### CHANGED
# Retrieve all data based on message size
while len(data) < msg_size:
data += clientsocket.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
# Extract frame
frame = pickle.loads(frame_data)
# Display
cv2.imshow('frame', frame)
cv2.waitKey(1)
Also, I managed to stream my webcam to an IP address
this is the code:
#Import necessary libraries
from flask import Flask, render_template, Response
import cv2
import pickle
import socket
import struct
import cv2
HOST = ''
PORT = 8089
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')
s.bind((HOST, PORT))
print('Socket bind complete')
s.listen(10)
print('Socket now listening')
conn, addr = s.accept()
data = b'' ### CHANGED
payload_size = struct.calcsize("L") ### CHANGED
#Initialize the Flask app
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
def gen():
while True:
# Retrieve message size
while len(data) < payload_size:
data += conn.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0] ### CHANGED
# Retrieve all data based on message size
while len(data) < msg_size:
data += conn.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
# Extract frame
frame = pickle.loads(frame_data)
ret, jpeg = cv2.imencode('.jpg', frame)
frame = jpeg.tobytes()
yield (b'--framern'
b'Content-Type: image/jpegrnrn' + frame + b'rnrn')
@app.route('/video_feed')
def video_feed():
return Response(gen(),
mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
# app.run(host='0.0.0.0', port=5000, debug=True)
app.run(host='192.168.1.28', port=8080, debug=True)
Now I am trying to change the second code and let it receive the frames fromm the socket as shown in the first code, but I am stuck.
Can anyone guide me for the solution
I tried to this but it does not work.
from flask import Flask, render_template, Response
import socket
import pickle
import struct
app = Flask(__name__)
# Set up socket connection
PORT = 5050
SERVER = "127.0.0.1"
ADDR = (SERVER, PORT)
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(ADDR)
data = b''
payload_size = struct.calcsize("L")
def gen():
while True:
# Retrieve message size
while len(data) < payload_size:
data += clientsocket.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0]
# Retrieve all data based on message size
while len(data) < msg_size:
data += clientsocket.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
# Extract frame
frame = pickle.loads(frame_data)
# Yield frame for Flask app
yield (b'--framern'
b'Content-Type: image/jpegrnrn' + frame + b'rnrn')
@app.route('/')
def index():
return render_template('index.html')
@app.route('/video_feed')
def video_feed():
return Response(gen(), mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
# app.run(host='0.0.0.0', port=5000, debug=True)
app.run(host='0.0.0.0', port=8080, debug=True)
Mohammad is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.