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