服务器端每秒收到的问题帧

问题描述

我有以下代码客户端向服务器发送帧。我需要计算每秒从客户端发送的帧数和在服务器上接收的帧数的差异。 在我当前的代码中,我让客户端每秒发送帧,这工作正常,目前,客户端发送 16 帧,服务器接收每秒 15 帧。但是在服务器端,它没有计算每秒接收到的正确帧数。如果我将任务大小发送到 15,但如果我将其设置为大于它会收到更多,并且在服务器端的大部分时间里,我将收到每秒 0.0 帧。注意如果我删除异步并选择线程,我每秒检索 1 帧,这非常慢。非常感谢帮助谢谢

客户端

FPS = 25
context = zmq.Context()
server = context.socket(zmq.PUSH)
server.connect(SERVER_A_ADDRESS)
destination = {"currentSocket": server}
running = True
frame_requests = 0
def data_rate():
  global destination,running,frame_requests
  while running:
    before_sent = frame_requests
    time.sleep(1)
    after_sent = frame_requests
    print("{} ( i ) : send frames: {} per second.".format(strftime('%H:%M:%s'),round((after_sent - before_sent) / 1,2)))   
def send_frame(frame,frame_requests):
   global destination,running
   try:
    frame = cv2.resize(frame,(224,224))
    encoded,buffer = cv2.imencode('.jpg',frame)
    jpg_as_text = base64.b64encode(buffer)
    destination["currentSocket"].send(jpg_as_text)
   except Exception as Error:
    print(Error)
    running = False
def main():
  global destination,frame_requests
  interval = 1 / FPS
  while running:
    for img in filenames:
        frame = cv2.imread(img)
        frame_requests += 1
        threading.Thread(target=send_frame,args=(frame,frame_requests)).start()
        time.sleep(interval)
    running=False
  destination["currentSocket"].close()
if __name__ == "__main__":
 threading.Thread(target=data_rate).start()
 main()

服务端

context = zmq.Context()
socket = context.socket(zmq.PULL)
dest_socket = context.socket(zmq.PUSH)
socket.bind(SERVER_ADDRESS)
dest_socket.connect(DEST_SERVER_ADDRESS)
tasks=20
running = True
count=1
async def forward_data(frame,count):
   global m1,m2
   source = cv2.imdecode(np.fromstring(base64.b64decode(frame),dtype=np.uint8),1)
   image = img_to_array(source)
   image = image.reshape((1,image.shape[0],image.shape[1],image.shape[2]))
   preds = m1.predict(preprocess_input(image))
   serialized_preds = pickle.dumps(preds)
   compressed_preds = zlib.compress(serialized_preds)
   dest_socket.send(compressed_preds)

def data_rate():
  global  count,running
  while running:
    before_recv = count
    time.sleep(1)
    after_recv = count
    print("{} ( i ) : sending frames: {} per second.".format(time.strftime('%H:%M:%s'),round((after_recv - before_recv) /1,2)))
async def main():
  global dest_socket,count
  tasks = []
  while True:
    try:      
           frame = socket.recv_string()
           count += 1
           print("{} ( + ) :  Received frame {} from {} successfully.".format(time.strftime('%H:%M:%s'),count,CLIENT_TITLE))
           task = asyncio.ensure_future(forward_data(frame,count))
           tasks.append(task)
           if len(tasks) >= 20:
                await asyncio.gather(*tasks,return_exceptions=True)
                tasks.clear()
     except Exception as error:
        print(Error)
        break
  socket.close()
 if __name__ == "__main__":
  threading.Thread(target=data_rate).start()
  loop = asyncio.get_event_loop()
  loop.run_until_complete(main())

输出

#########################
19:41:25 ( i ) :frames: 20.0 per second.
#########################
19:41:25 ( + ) :  SERVER B received array 2 successfully.
19:41:25 ( i ) :  Sending array 3 to SERVER B...
19:41:26 ( + ) :  SERVER B received array 3 successfully.
19:41:26 ( i ) :  Sending array 4 to SERVER B...
#########################
19:41:26 ( i ) :  frames: 0.0 per second.
#########################
19:41:26 ( + ) :  SERVER B received array 4 successfully.
19:41:27 ( i ) :  Sending array 5 to SERVER B...
#########################
19:41:27 ( i ) : frames: 0.0 per second.
#########################

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)