为什么我检索的正在读取的帧多于文件夹 pyzmq 中的帧

Why I am retrieving more frames being read than they are in folder pyzmq

我有以下代码发送从文件夹中读取的视频帧并发送到服务器。文件夹中总共有 511 帧,但我的代码在从文件夹中读取的输出 1000 帧中提供了更多帧。

SERVER_A_ADDRESS = "tcp://localhost:5555"
CLIENT_ADDRESS = "tcp://*:5553"
SERVER_A_TITLE = "Server A"
SERVER_B_TITLE = "Server B"

context = zmq.Context()
socket_server_a = context.socket(zmq.PUSH)
socket_server_endpoint = context.socket(zmq.PULL)
socket_server_a.connect(SERVER_A_ADDRESS)

socket_server_endpoint.bind(CLIENT_ADDRESS)
destination = {
 "currentSocket": socket_server_a,
 "currentServersTitle": SERVER_A_TITLE,
 "currentEndpoint": SERVER_B_TITLE, }
running = True
endpoint_responses = 0
frame_count = 0
def send_frame(frame, frame_count):
 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)
    print(f"{strftime('%H:%M:%S')} ( + ) :  {destination['currentServersTitle']} received frame {frame_count}")
 except Exception as Error:
    print(
        f"{strftime('%H:%M:%S')} ( ! ) :  Error frame {frame_count}\n\n> KILLING CONNECTIONS\n\nERROR MESSAGE: {Error}")
    running = False
def main():
 global destination, running, frame_count
 filenames = [img for img in glob.glob("video-frames/*.jpg")]
 fps = 5
 interval = int(1 / fps)
 while running:
    filenames = sorted(filenames, key=os.path.getctime) or filenames.sort(key=os.path.getctime)
    for img in filenames:
        frame = cv2.imread(img)
        frame_count += 1
        threading.Thread(target=send_frame, args=(frame, frame_count)).start()
        time.sleep(interval)
 destination["currentSocket"].close()
if  __name__ == "__main__":
 main()

谢谢

Q : "Why I am retrieving more frames being read than they are in folder"

除了输入代码之外,代码很少做任何其他事情。

机器不会思考,它们确实服从我们的指示,一步一步:

#     +++++++-------------------------------------------------- weak control-VAR
#     |||||||
#     vvvvvvv
while running: # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ INFINITE LOOP
    filenames = sorted( filenames,      key = os.path.getctime )\
                or      filenames.sort( key = os.path.getctime )# .SET | .UPD
    ###################################### .ITERATE over []-members
    for img in filenames: # .............# .GET img
        frame = cv2.imread( img )        # .SET frame
        ...                              # .??? whatever
        #................................# .??? goes here on
    ###################################### .ITERATE.NEXT()
# _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ REPEAT INFINITE LOOP

在“标称”条件下,这将 运行 一次又一次,就像编码的那样。

除了一个“软”中断来退出这个无限循环,在第一个 Exception,无论是被处理的还是任何其他的,问题在于没有明确的终止存在来停止,之后您不希望处理 “比文件夹中更多的帧”。代码按原样忽略了此条件,因此 WHY 部分很清楚。


解决方案?

重构代码,以符合您的实际愿望,一旦 filenames-list 被处理一次且仅一次,硬停止或软停止无限循环。如果文件夹内容是动态的(随时间变化),则需要更多的努力来重构代码,因此从您需要和想要做的事情开始,而不是从原样代码(仅)遵守的事情开始(因为被指示在那里做)。