You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:06:01