我正在尝试了解spydroid(https://code.google.com/p/spydroid-ipcamera/)的工作原理,因此我可以为手机编写类似的应用程序。基于spydroid这里是我对RTSP,RTCP和RTP的理解。
RTSP在指定端口上运行并设置所有内容。
RTCP可以在任何端口上运行。有一个客户端端口和一个服务器端口。这是RTP的控制流程
RTP可以在任何端口上运行。有一个客户端端口和一个服务器端口。这包含音频和视频流。这很令人困惑,因为它似乎并没有真正发送此端口上的音频和视频。在spydroid中,它在端口5006上发送视频,在5004上发送音频。
Spydroid通过RTSP发送此消息以确认端口... 传输:RTP / AVP / UDP;单播;目的地= 123.456.789.00; client_port = 65234-65235; server_port = 44580-44581; ssrc = ba98a863; mode = play
我认为这说的是客户端(在我的情况下是VLC)正在侦听65234,使用UDP进行RTP,使用65235进行RTCP消息。此外,spydroid正在收听44580的RTP和44581的RTCP。这是对的吗?
现在在RTSP的DESCRIBE序列中,spydroid告诉客户端m =视频5006 RTP / AVP 96我认为这是说它将通过端口5006通过UDP发送视频。
我在上述句子中所说的一切听起来都是正确的吗?
我真正想知道的是如何将此信息转发到正确的端口。客户端端口由VLC自动分配。我尝试运行这个命令... vlc“rtsp://192.168.1.104:8086”--rtp-client-port = 58866但是VLC似乎忽略它并选择它自己的端口。所以我已经转发了端口8086,5004和5006,但我不知道转发哪个端口用于RTP和RTCP连接,因为它每次都会更改。我能做到这一点的唯一方法是将所有端口转发到我的计算机。 (我有一个linksys路由器,它有一个DMZ选项)但这是一个糟糕的解决方案。有人可以指导我正确的方向。
同样很高兴知道我这样做是因为我通过互联网通过外部IP地址发送所有内容。 spydroid旨在用于局域网。
答案 0 :(得分:0)
我不知道RTSP如何工作以及如何配置VLC,但我知道RTP的一件事或两件事。 我猜客户端端口意味着spydroid将发送数据包,服务器端口将用作源端口。所以在UDP级别,RTP数据包看起来像:
| SRC_PORT = 44580 | DST_PORT = 65234 | ... RTP_PACKET |
下一个:m =视频5006 RTP / AVP 96 根据SDP标准5006是spydroid将监听传入RTP数据包的端口 (不确定原因)并且RTP有效载荷类型为96。
因此,请检查VLC是否侦听端口65234并将{44580,65234}数据包转发到您的PC。 你给的信息有点混乱,似乎自相矛盾。因此,不能基于此得出具体结论。
答案 1 :(得分:0)
根据SDP标准......
实际上它表示源端口。
端口(范围)仅表示将从中发送媒体的位置。
例如,如果你的消息来源发送5006,但它通过10002路由,rtsp帮助通过传输头。
源端口可能确实是5006,但是局域网内部的中间路由器或防火墙接收到数据包并通过另一个端口和地址发送。
大多数软件都不会自动了解您的网络设置,因此无需修改外部网络使用的sdp,它就无法在您的网络地址空间之外的任何地方使用。
如果您需要端口匹配它,您只需手动配置套接字和软件即可。 (例如,多播或其他原因,为什么该端口(范围)需要与rtsp传输头中的内容不同,但如果它是......那么现在您了解了如何以及为什么。
Live 555和其他一些人发送探测数据包,如果该数据包是通过icmp返回的,则源端口重置为0以便可以发现它,请注意,如果没有正确完成,这可能会与来自主机的现有流量冲突。
QuickTime和vlc实际上将其搞砸了(大多数人都这样做)并允许在使用0时从同一主机的任何端口直接注入解码器,并且ffmpeg和lav不在媒体端口中正确支持范围。
就像思考一样,如果端口号为1或65536或*或-7,该怎么办?
这不应该处理吗?
如果范围是*或 - 或其他怎么办?
请记住,仅仅因为某个值不存在并不意味着如果需要,您无法对现有信息做正确的事情即使收到的数据不符合预期或者指示的值不应该使用。