Python UDP同步观影项目Errno 10040与base64解码错误解决方案咨询
问题1:Errno 10040 UDP报文大小超限解决方案
原因
UDP协议本身存在传输大小限制:理论最大报文长度为65535字节,但实际网络链路层MTU通常为1500字节,扣除IP、UDP报文头后,实际安全传输的UDP payload大小仅为1472字节左右。你当前直接发送整帧编码后的JPG数据,超过了系统或者网络的限制,就会触发该报错。另外你仅配置了服务端接收缓冲区,未配置发送缓冲区也是诱因之一。
修复方案
- 首先补充服务端发送缓冲区配置,在服务端socket初始化部分添加一行:
server_socket_main.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, BUFFOR_SIZE_DATA)
- 降低单帧数据大小:
- 调低JPG编码质量,将
[cv2.IMWRITE_JPEG_QUALITY, 80]中的80调整为30~60区间 - 缩小帧分辨率,把
WIDTH = 1024下调为720或者更低
- 调低JPG编码质量,将
- 拆包传输:将base64编码后的帧数据切分为1400字节以内的分片,每个分片增加序号、帧ID、结束标识,客户端接收完同一帧的所有分片后重组再解码,避免单包过大
- 若对传输稳定性要求高,建议直接改用TCP协议传输,UDP本身存在丢包、乱序问题,不适合对帧完整性要求高的视频传输场景
问题2:base64.b85decode 报错解决方案
原因
- 编解码算法不匹配:服务端使用
base64.b64encode编码数据,客户端错误调用了base64.b85decode解码,b64和b85是完全不同的base编码算法,完全不兼容 - 参数使用错误:Python标准库的
base64.b85decode仅支持1个入参,你传入的第二个参数' /'属于无效参数,直接触发类型错误 - 额外语法错误:你代码中
dtype=np.unit8是拼写错误,正确写法为np.uint8;np.fromstring已被废弃,建议改用np.frombuffer避免警告
修复后的客户端核心代码:
while True: packet,_ = client_socket_main.recvfrom(BUFFOR_SIZE_DATA) # 改用b64decode和服务端编码匹配,删除无效第二个参数 data = base64.b64decode(packet) # 修正类型拼写错误,改用frombuffer npdata = np.frombuffer(data, dtype=np.uint8) frame = cv2.imdecode(npdata, 1) cv2.imshow('Currently watching ', frame) key = cv2.waitKey(1) & 0xFF if key == ord('c'): client_socket_main.close() break
内容的提问来源于stack exchange,提问作者JUANOOO
相关产品推荐
相关产品推荐

