gpt4 book ai didi

python - 如何使用 django 纠正 zmq 地址使用错误

转载 作者:行者123 更新时间:2023-12-01 08:38:15 28 4
gpt4 key购买 nike

我正在尝试使用 Django 创建一个简单的视频流网站。我使用 cv2 启动网络摄像头,使用 ZMQ 将数据从客户端传输到服务器。我发现了这个link 我用它编写了代码的网络部分。

代码本身工作正常,但是当我创建一个简单的 HTML 文件以通过浏览器启动实时流时,代码失败并显示此错误消息

zmq.error.ZMQError: Address in use

我猜这个错误的出现是因为Django使用的IP和ZMQ尝试使用的IP是相同的。但我不知道如何纠正这个错误。

这是我到目前为止的代码

服务器.py

def start_server():
context = zmq.Context()
footage_socket = context.socket(zmq.SUB)
print('socket created')

footage_socket.setsockopt_string(zmq.SUBSCRIBE, np.unicode(''))
footage_socket.bind('tcp://192.168.1.18:5020')

print('binding complete')
print('server ready')

return footage_socket

def recv_content(socket, face_cascade_path):

cascade = cv2.CascadeClassifier(face_cascade_path)

while True:
try:
data = socket.recv_string()
img = base64.b64decode(data)
npimg = np.fromstring(img, dtype=np.uint8)
frame = cv2.imdecode(npimg, 1)
print(frame)

face = cascade.detectMultiScale(frame, scaleFactor=1.3, minNeighbors=3)

for (x, y, w, h) in face:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)

if cv2.waitKey(1) & 0xFF == ord('q'):
break

cv2.imshow("Stream", frame)

except KeyboardInterrupt:
cv2.destroyAllWindows()
break

views.py

from server import *

def index(request):

face_cascade_path = '../../../TRAINED MODELS/FACE/haarcascade_frontalface_default.xml'
footage_socket = start_server()
recv_content(footage_socket, face_cascade_path)

return render(request, 'index.html')

def start_client(request):
context = zmq.Context()
footage_socket = context.socket(zmq.PUB)
footage_socket.connect('tcp://192.168.1.18:5020')

print('connected to server')
print('starting video on client machine')

camera = cv2.VideoCapture(0) # init the camera

while True:
try:
grabbed, frame = camera.read() # grab the current frame
frame = cv2.resize(frame, (640, 480)) # resize the frame
frame = cv2.flip(frame, 1)
encoded, buffer = cv2.imencode('.jpg', frame)
jpg_as_text = base64.b64encode(buffer)
footage_socket.send(jpg_as_text)

except KeyboardInterrupt:
camera.release()
cv2.destroyAllWindows()
break

index.html

<html>
<head>

</head>
<body>
<div class='container'>
<h2>CAMERA SERVER CLIENT TEST</h2>

<p>
Click the start_client button to start camera. Each frame of the stream is sent to the server.
</p>
<p>
The camera code is running on the client side.
</p>

<a href ='start_client/'><button>start client</button></a>

</div>
</body>
</html>

请帮助我。

提前谢谢

编辑1 - 我已编辑以添加代码的客户端部分和index.html。 start_client函数位于views.py下。当单击index.html中的start_client按钮时运行该函数

编辑 2 - 我已编辑问题以添加问题的屏幕截图。虽然在添加 try- except block 后刷新页面时我没有遇到“地址正在使用”错误,但网页仍然无法加载。

enter image description here

最佳答案

您应该采用其他端口,而不是通常使用的常见 8000 端口。

另一个想法是,任何套接字选项都必须放在 ZMQ 中的 bindconnect 方法之前。

所以你的代码看起来像这样:

def start_server():
context = zmq.Context()
footage_socket = context.socket(zmq.SUB)
footage_socket.setsockopt_string(zmq.SUBSCRIBE, np.unicode(''))

try:
footage_socket.bind('tcp://192.168.1.18:5020') # Another port used.
except:
pass

return footage_socket
<小时/>

[注意]:

不要忘记将客户端的端口 (.connect()) 更改为 5020

<小时/>

[更新]:

关于python - 如何使用 django 纠正 zmq 地址使用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53606151/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com