技术

重构了三次

讲个笑话,这个集群模式的控制器,写完一个版本觉得不满意,然后重构,又不满意,又重构

RTP pkt_size 超过 1200

我觉得应该先解释一下原理:

目前大部分网络的 MTU(Maximum Transmission Unit) 是 1500,对于 UDP 来说,需要去掉以太网头,IP 头,UDP 头。另外还要考虑 VPN 的情况。大部分 VPN 对于 UDP 是又套了一层。这会导致 MTU 变得更小。比如:wireguard 的 mtu 是 1420,但 tailscale 是 1280。但 WebRTC 为了保证能通过所以的网络直接把值限制在 1200

如何把降到 1200 以下,最简单的办法是在产生 RTP 的时候加参数,比如设置 pkt_size

ffmpeg -re -f lavfi -i testsrc=size=640x480:rate=30 -vcodec libvpx \\
-f rtp 'rtp://127.0.0.1:5003?pkt_size=1200'

如果保证全部的包都在 1200 以下,RTP 到 WebRTC 的转换我们用了一种非常 trick 的方式。直接发过去就行了

但很多应用根本没考虑要手动设置 pkt_size 的情况,大部分应用的都不支持。即使留了这个底层用了 ffmpeg。仍然不支持设置 pkt_size 。我们需要收到包重新调整封包大小

UDP 里面是 RTP。我们需要先知道 RTP 的大小是怎么来的,通过抓包可以看到 RTP 包有大有小

Screenshot 2024-05-29 at 21.55.45.png

所为视频流,其实就是一段(segment)(或者叫最小解码单元)一段传输的,极限一点,我们假设每个 RTP 包只传一帧,一段可能是很多帧。压制后(VP8,H264一类的编码处理过)的视频其实是一张完整的图片加上和这个图片的差量。完整的图片叫 I 帧,下一帧是 I 帧加差量数据,这个差量数据叫 P 帧(其他的帧类型暂不考虑)