中继服务器代理 WebRTC 是可行的,我找到一个开源项目 pion/webrtc 的示例验证了这一点:
https://github.com/pion/webrtc/tree/master/examples/rtp-forwarder
核心逻辑是:
// 创建两个 PeerConnection: 一个接收,一个发送
pcRecv, err := webrtc.NewPeerConnection(config)
pcSend, err := webrtc.NewPeerConnection(config)
// 当收到远程轨道时
pcRecv.OnTrack(func(remoteTrack *webrtc.TrackRemote, _ *webrtc.RTPReceiver) {
// 创建本地轨道
localTrack, err := webrtc.NewTrackLocalStaticRTP(
remoteTrack.Codec().RTPCodecCapability,
"video",
"pion",
)
// 添加到发送端
rtpSender, err := pcSend.AddTrack(localTrack)
// 转发 RTP 包
go func() {
for {
packet, _, err := remoteTrack.ReadRTP()
if err != nil {
return
}
if err := localTrack.WriteRTP(packet); err != nil {
return
}
}
}()
})
这个方案是可以工作的,因为: 1. RTP 包可以被拦截和转发 2. 两个 PeerConnection 可以桥接媒体流 3. 已有成功的实现案例
不过需要注意: 1. 会增加延迟 2. 需要较大带宽 3. 服务器负载会增加