ZeroMQ PUB/SUB模式多订阅者无法同时接收视频流问题排查
问题根因
你把ZMQ PUB/SUB模式下的bind和connect操作方向搞反了,这是核心问题:
- 同一时间,同一个IPC路径仅允许一个进程执行
bind操作。你的代码中让所有订阅者(客户端)执行bind绑定ipc:///tmp/v4l,第一个启动的客户端会独占该路径,后续客户端绑定失败自然无法接收数据。服务端作为发布者执行connect,只会连接到第一个成功绑定路径的客户端,所以只有第一个启动的客户端能收到数据,关闭第一个后第二个才会接入。
修正方案
互换两端的bind和connect逻辑即可:
- 服务端(发布者)修改代码:
将原代码中的
publisher.connect("ipc:///tmp/v4l")
替换为
publisher.bind("ipc:///tmp/v4l")
- 客户端(订阅者)修改代码:
将原代码中的
subscriber.bind("ipc:///tmp/v4l")
替换为
subscriber.connect("ipc:///tmp/v4l")
额外注意事项
ZMQ PUB端启动后和SUB端完成IPC握手需要极短时间,如果你启动发布者后立刻发送视频帧,前几秒的帧可能会丢失,可以在发布者bind完成后加1秒左右的延迟,等待所有订阅者完成连接再开始发数据,避免丢帧。
内容的提问来源于stack exchange,提问作者Bok
相关产品推荐
相关产品推荐

