问题描述
我有以下代码将视频帧从服务器发送到客户端。我正在检索server.py上的错误。
Server.py
import base64
import cv2
import zmq
import time
import numpy as np
context = zmq.Context()
footage_socket = context.socket(zmq.SUB)
footage_socket.bind('tcp://0.0.0.0:5555')
footage_socket.setsockopt_string(zmq.SUBSCRIBE,np.unicode(''))
videoFile = 'SAMPLE.mp4'
camera = cv2.VideoCapture(videoFile) # init the camera
length=int(camera.get(cv2.CAP_PROP_FRAME_COUNT))
while True:
grabbed,frame = camera.read()
try:
frame = cv2.resize(frame,(224,224))
except cv2.error:
break
encoded,buffer = cv2.imencode('.jpg',frame)
jpg_as_text = base64.b64encode(buffer)
time.sleep(3)
footage_socket.send(jpg_as_text)
footage_socket.close()
Client.py
import cv2,zmq,base64
import numpy as np
context = zmq.Context()
footage_socket = context.socket(zmq.PUB)
footage_socket.connect('tcp://10.96.0.1:5555')
while True:
frame = footage_socket.recv_string()
source = cv2.imdecode( np.fromstring( base64.b64decode( frame ),dtype = np.uint8),1 )
我正在检索以下错误
footage_socket.send(jpg_as_text)
File "/usr/local/lib/python3.5/dist-packages/zmq/sugar/socket.py",line 391,in send
return super(Socket,self).send(data,flags=flags,copy=copy,track=track)
File "zmq/backend/cython/socket.pyx",line 727,in zmq.backend.cython.socket.socket.send
File "zmq/backend/cython/socket.pyx",line 774,line 249,in zmq.backend.cython.socket._send_copy
File "zmq/backend/cython/socket.pyx",line 244,in zmq.backend.cython.socket._send_copy
File "zmq/backend/cython/checkrc.pxd",line 25,in zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: Operation not supported
非常感谢您的帮助。
解决方法
您的代码尝试调用.recv_string()
类实例上的Socket
方法,该实例的类型为 PUB
。
那将永远行不通。 PUB
可扩展的形式化通信原型属于某种PUB
+多可以SUB
的订阅者,用于接收与他们的有效{ {1}}说明详细信息。
有充分记录和发布的ZeroMQ API规范,对此非常明确。 PUB
可以SUB
但不能PUB
.send()
中的.recv()
-socket实例也会发生同样的情况,您的代码(按原样)命令调用SUB
,这可以永远不会发生Server.py
套接字。
.send()
是此类API冲突尝试的唯一结果。