RTSP、RTCP和RTP端口号

5
我正在尝试理解spydroid(https://code.google.com/p/spydroid-ipcamera/)的工作原理,以便为我的手机编写类似的应用程序。基于spydroid,以下是我对RTSP、RTCP和RTP的理解。
RTSP在指定的端口上运行并设置所有内容。
RTCP可以在任何端口上运行。有一个客户端端口和一个服务器端口。这是RTP的控制流程。
RTP可以在任何端口上运行。有一个客户端端口和一个服务器端口。它包含音频和视频的流。这很令人困惑,因为它似乎并没有实际上在此端口上发送音频和视频。在spydroid中,它将视频发送到5006端口,将音频发送到5004端口。
Spydroid通过RTSP发送此消息以确认端口... Transport: RTP/AVP/UDP;unicast;destination=123.456.789.00;client_port=65234-65235;server_port=44580-44581;ssrc=ba98a863;mode=play
我认为这句话的意思是客户端(在我的情况下是VLC)正在使用UDP监听65234端口以获取RTP和65235端口以获取RTCP消息。同时,Spydroid正在44580端口上监听RTP和44581端口上监听RTCP。这样说对吗?
现在,在RTSP的DESCRIBE序列中,Spydroid告诉客户端m=video 5006 RTP/AVP 96,我认为这是在说它将通过UDP在5006端口上传输视频。
我上面说的一切是否都正确?
我真正想知道的是如何将此信息转发到正确的端口。客户端端口由VLC自动分配。我尝试运行以下命令... vlc "rtsp://192.168.1.104:8086" --rtp-client-port=58866,但VLC似乎忽略了它并选择了自己的端口。因此,我已经转发了8086、5004和5006端口,但我不知道要转发哪个端口以进行RTP和RTCP连接,因为每次都会更改。唯一能让这个工作的方法是将所有端口都转发到我的计算机上。(我有一个Linksys路由器,它有一个DMZ选项)。但这是一个不好的解决方案。请问有人可以指导我正确的方向吗?
此外,值得一提的是我这样做是因为我通过互联网发送所有东西都经过一个外部IP地址。而Spydroid则旨在用于本地区域网络。
2个回答

1

我不知道RTSP是如何工作和如何配置VLC,但我对RTP有一些了解。 我猜测客户端端口意味着spydroid将发送数据包的位置,而服务器端口则是它将用作源端口的位置。因此,在UDP级别上,RTP数据包将如下所示:

| SRC_PORT=44580 | DST_PORT=65234 | ... RTP_PACKET |

接下来:m=video 5006 RTP/AVP 96 根据SDP标准,5006是spydroid将侦听传入RTP数据包的端口(不确定为什么),而RTP有效载荷类型将是96。

因此,请检查是否使VLC侦听端口65234并将{44580、65234}数据包转发到您的PC可行。 您提供的信息有点混乱,似乎自相矛盾。因此,无法根据该信息得出任何具体结论。


1
根据SDP标准,实际上它指示了源端口。
端口(范围)只是表示媒体将从那里发送。
例如,如果您的源发送到5006,但通过10002进行路由,这就是rtsp通过传输头帮助的地方。
源端口可能真的是5006,但位于局域网内部的中间路由器或防火墙接收到数据包并通过另一个端口和地址发送出去。
大多数软件不会自动了解您的网络设置,因此,如果不修改用于外部网络使用的sdp,它实际上无法在您的网络地址空间之外的任何地方使用。
如果您需要端口匹配,您只需手动配置套接字和软件即可。(例如,组播或其他一些原因导致该端口(范围)需要与rtsp传输头中的内容不同,但如果是这样...那么现在您明白了如何以及为什么。
Live 555和其他一些软件会发送探测数据包,如果该数据包通过icmp返回,则源端口将重置为0,以便进行发现。请注意,如果操作不正确,这可能与主机上的现有流量冲突。

QuickTime 和 vlc 实际上搞砸了这件事(几乎所有人都是如此),当使用 0 时,它们允许从同一主机的任何端口直接注入解码器,而 ffmpeg 和 lav 在媒体端口上不正确地支持范围。

只是思考的练习,如果端口号是1、65536、* 或 -7 呢?

难道那也不应该被处理吗?

如果范围是 *、- 或其他情况呢?

请记住,仅因为一个值不存在并不意味着您不能根据现有信息来正确处理,即使接收到的数据与预期不符或指示了不应使用的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接