为什么当我 relpying 我收到的 RTP 数据包时,呼叫者听不到回声

Why the caller don't hear echo when I'm relpying the RTP packets I receied

我正在尝试使用 NodeJS 为所有呼叫我的人播放音频。

他正在使用 SIP 并发起呼叫。我能够接听电话并录制他的音频。

现在我正在尝试使用 RTP 协议向他播放音频。

所以我尝试的是保存我收到的每个 RTP 数据包,然后按原样发回。 但我不明白为什么他什么也听不到。

INVITE 命令

INVITE sip:1@104.154.78.142 SIP/2.0
Via: SIP/2.0/UDP 31.168.3.211:5060;branch=z9hG4bK071d7c26
Max-Forwards: 70
From: "0555042354" <sip:0523737233@31.168.3.211>;tag=as710f47f3
To: <sip:1@104.154.78.142>
Contact: <sip:0523737233@31.168.3.211:5060>
Call-ID: 36bde5b72f7a67956f7559a8581ea010@31.168.3.211:5060
CSeq: 102 INVITE
User-Agent: Asterisk PBX 11.18.0
Date: Fri, 05 Feb 2021 00:22:51 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Type: application/sdp
Content-Length: 236

v=0
o=root 2117083987 2117083987 IN IP4 31.168.3.211
s=Asterisk PBX 11.18.0
c=IN IP4 31.168.3.211
t=0 0
m=audio 16006 RTP/AVP 8 101
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=ptime:20
a=sendrecv

我从 INVITE 命令获取它的端口 (15574):m=audio 15574 RTP/AVP 8 101 并且 IP 也从 INVITE 命令获取:c=IN IP4 31.168.3.195 现在我要发回他发送给我的每个 UDP 数据包。但是他什么也没听到。

(OK之后,被他ACK了)

ourSocket.on('message', (rtpPacketBuffer) => {
  dgramServer.send(rtpPacketBuffer, 16006, 31.168.3.211)
})

换句话说:根据RTP协议,发回数据包是可行的,还是我需要重构它们?

(我们能够听到对方的声音,并对通话进行录音。)

In other words: According to RTP protocol, is sending back the packet can work, or do I need to reconstruct them?

您需要构建一个专用的 RTP header 并添加接收到的负载。 必须以有意义的方式生成 SSRC 和时间戳,否则接收方可能会丢弃这些数据包。