这很难解释。我编写了一个运行良好的 RTP 音频发送器和 RTP 接收器,使用 TIdUDPClient (发送器)和 TIdUDPServer (接收器)在 Delphi 中编写。您可以将这些视为通过 UDP 发送和接收数据。这些被封装在大型应用程序中使用的 2 个组件中。
包含 RTP 发送器的软件还有一个单独的 UDP 服务器用于接受文本命令。
在包含 RTP 接收器组件的单独应用程序中,我需要通过向单独的 UDP 服务器发送命令来激活发送器,例如。 “startrtp”。然后在发送器中,我读取 PeerIP 和 PeerPort 并将它们放入 RTP 发送器组件中,并告诉它将音频数据发送回发送“startrtp”命令的端口。我想使用与发送命令相同的 IP/端口,因此接收端的任何路由器都会让该数据通过,因为它期待 2 路 UDP 通信,而无需执行任何端口转发。据我了解,该端口可以由 RTP 服务器端的路由器随机生成。但在接收器应用程序中,我不确定要设置 RTP 接收器组件的哪个端口来接收音频数据。
将“startrtp”发送到 RTP 发送器应用程序后,发送器是否需要发回包含 PeerIP 和 PeerPort 详细信息的回复,以便我可以将其输入到 RTP 接收器组件中?或者有什么方法可以在发送“startrtp”命令后从 UDPClient 发现此信息?我很困惑 2 路通信如何通过 UDP 工作。
我希望我说得有道理。
一种描述方式就像将 2 路 UDP“连接”的控制权无缝地移交给单独的 TIdUPDClient/TIdUPDServer 组件。我知道 UDP 是无连接的,所以这肯定是可能的。我只是完全困惑了。
然后在 Sender 中,我读取 PeerIP 和 PeerPort 并将它们放入 RTP Sender 组件中,并告诉它将音频数据发送回发送“startrtp”命令的端口。我想使用与发送命令相同的 IP/端口,这样接收端的任何路由器都会让该数据通过,因为它期待 2 路 UDP 通信,而无需执行任何端口转发。
为此,您必须去掉接收端的
TIdUDPClient
,而让其 TIdUDPServer
处理文本发送和音频接收。您可以使用 TIdSocketHandle
集合中的相同 TIdUDPServer.Bindings
对象发送文本命令,该对象将接收音频数据包并触发 TIdUDPServer.OnUDPRead
事件。