Python基于TCP socket的视频流传输代码部分逻辑求讲解
1 客户端
struct.pack代码逻辑讲解 TCP是面向字节流的传输协议,本身不提供消息边界标识,连续发送数据时会出现粘包/拆包问题:服务端收到的字节序列可能包含半帧、多帧混合的数据,无法直接区分出完整的单帧内容。这里的代码用固定长度长度前缀方案解决边界问题,是视频流传输的通用实现:
struct.pack("Q", len(a)):struct.pack作用是将Python数值转为固定长度的字节序列,格式符Q代表无符号长长整型,固定占8字节,取值范围覆盖所有常见单帧视频的序列化长度。这里先将序列化后帧数据a的字节长度打包为8字节的固定前缀。- 最终拼接得到的
message结构为[8字节长度前缀][实际帧字节数据],发给服务端后,服务端可通过固定的前缀规则快速拆分完整帧。
2 服务端接收处理全流程
pyshine的标准服务端接收逻辑是基于缓冲区的循环处理,完整步骤如下:
- 初始化空字节缓冲区,用于存储已接收但未处理的socket数据
- 循环调用socket的
recv方法接收字节数据,追加到缓冲区末尾 - 首先判断缓冲区总长度是否≥8字节:不足则继续接收,直到凑够8字节的长度前缀
- 取出缓冲区前8字节,通过
struct.unpack("Q", 前8字节)[0]解码得到当前帧的实际字节长度,记为frame_size - 再次判断缓冲区剩余(扣除前8字节后)的长度是否≥
frame_size:- 不足则继续接收数据追加到缓冲区,直到总长度≥
8 + frame_size - 足够则截取缓冲区中
[8 : 8 + frame_size]区间的字节,这部分就是完整的序列化帧数据frame_data
- 不足则继续接收数据追加到缓冲区,直到总长度≥
- 将缓冲区中已经处理完成的前
8 + frame_size字节删除,剩余字节留到下一轮循环处理(通常是下一个帧的前缀或部分数据) - 对
frame_data做pickle反序列化即可得到原始视频帧对象,用于后续的显示、分析等操作
内容的提问来源于stack exchange,提问作者user509OZ
相关产品推荐
相关产品推荐

