最近我试图通过 udp 流式传输由网络摄像头捕获的实时视频。我采用的方法是读取一帧,通过 udp 发送并在接收端读取数据并显示它。
现在,我知道通过 udp/tcp 发送数据会导致碎片化,这种碎片化会以任何随机方式发生,具体取决于传输层的 MTU,并且底层 IP 协议并不能保证将交付的帧数。任何数据层的最小 MTU 被称为 1500 字节。
但是,我的每一帧都是 1MB(~1048576 字节)。因此,考虑到 1500 字节的数据碎片,单个帧可能会被碎片化,然后接收器将获得约 700 个数据包 (1048576/1500)。现在接收器需要为一帧累积所有这 700 个数据包的数据,这涉及到额外的处理。这是正常的吗,仅 1 帧数据 700 个数据包!如果我想将帧速率保持在 24fps,这意味着接收器必须处理 700*24 = 16800 个数据包/秒,这似乎不可行。
我想了解另一个流媒体网站是如何工作的,它们绝对不会处理 16800 个数据包/秒。他们将使用其他流协议,如 RTSP,但是这些协议是建立在 UDP/TCP 之上的,这意味着这些协议也需要处理碎片。现在流媒体网站可以提供 4k 视频,每个帧大小将远大于 1MB,但 MTU 仍然是 1500 字节。他们还必须进行数据压缩,但压缩到什么程度。即使他们设法将帧大小减少了 50%(这也需要在接收端进行解压缩,这意味着额外的处理),对于低质量的 24fps 视频,他们仍然需要每秒处理约 8000 个数据包。他们如何处理它,他们如何管理这些规模的数据碎片。