内网无法播放公网rtsp流的问题

hs79hs 2015-05-13 02:49:10
用vlc的vlm功能搭了一个视频点播系统,放在AWS上,有公网IP(假设公网IP为11.11.11.11)。
然后在内网用vlc等播放器播放rtsp://11.11.11.11:8554/vod1。
在我家播放没有问题,但换了一个新环境,播放不了,用wireshark抓包发现,rtsp连接已经建立起来,PLAY会话后服务器也不停向客户端发送视频流和音频流的rtp包了,但内网机器却抓不到rtp包。
经分析,rtsp在SETUP会话时分别指定了服务器和客户端rtp和rtcp通信时要用到的端口号。SETUP后客户端向服务器发送了两包rtp和rtcp包用的也是指定的端口,但是路由器在转发这些包时应该是把指定端口号换成了其它端口号,因此服务器发现端口号不对,向客户端回复了ICMP,说unreachable port,其后服务器在PLAY会话后开始向客户端(路由器公网IP)指定端口发rtp包,而路由器对这些端口号的数据包没有转发给内网机器。
在我家抓包发现路由器转发rtp和rtcp包时没有改变内网数据包中的端口,所以播放没有问题。

问题:
1、不知以上我分析的对不对,如果真是这样,在无法对路由器设置端口转发的情况下,如何才能让内网播放rtsp流呢?我试过rtp over rtsp,即用rtsp的tcp连接来传rtp包,但vlc目前好像还不支持。
2、按照udp协议,路由器在出口时应该会将内网IP和端口改成自己的公网IP和另外的端口,为什么在我家试的时候总是端口一致呢?路由器能设置尽量使用内网原来数据包中的端口号吗?
...全文
5842 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingzhaoli 2017-09-13
  • 打赏
  • 举报
回复
楼主, 请问一下你这个内网到公网的传输问题你解决了吗?
xiaohei00001111 2017-07-07
  • 打赏
  • 举报
回复
请问ALG_RTSP有什么效果,怎样测试功能正常??
mlichenfeng 2015-09-12
  • 打赏
  • 举报
回复
楼主你好,我跟你遇到了差不多一样的问题,看了你的解决方案,有两个不解的地方 1、VLC在SETUP后会向服务器发送两个rtp包,那它会向服务器的哪个端口发送呢,需要在sdp文件中指定吗? 2、既然服务器可以获取到,为什么你还需要你去编译vlc呢?
rightorwrong 2015-08-20
  • 打赏
  • 举报
回复
引用 12 楼 hs79hs 的回复:
[quote=引用 11 楼 rightorwrong 的回复:] udp的话,需要客服端主动去链接下服务端流端口,要不然服务器数据发过来,客户端收不到
嗯,vlc客户端在SETUP后会主动向服务器发送两包rtp,应该是为了NAT打洞,我现在也是想利用这两包rtp源端口来修改服务器向客户端发流时的目的端口[/quote] 2个包是一个音频一个视频
hs79hs 2015-05-29
  • 打赏
  • 举报
回复
在ubuntu下重新编译vlc 2.2.1源码;修改modules/stream_out/rtsp.c,在SETUP会话后新启两个thread(分别对应video和audio流),接收client发送的rtp包,再修改server向client发送rtp包时的端口号,搞定,结贴:)
hs79hs 2015-05-21
  • 打赏
  • 举报
回复
引用 11 楼 rightorwrong 的回复:
udp的话,需要客服端主动去链接下服务端流端口,要不然服务器数据发过来,客户端收不到
嗯,vlc客户端在SETUP后会主动向服务器发送两包rtp,应该是为了NAT打洞,我现在也是想利用这两包rtp源端口来修改服务器向客户端发流时的目的端口
rightorwrong 2015-05-21
  • 打赏
  • 举报
回复
引用 10 楼 hs79hs 的回复:
[quote=引用 9 楼 rightorwrong 的回复:] 正常,用tcp播放
tcp太卡了,而且感觉直播流用tcp也不太适合 另外,vlc做服务器好像还没实现rtp over rtsp,Darwin倒是可以[/quote] udp的话,需要客服端主动去链接下服务端流端口,要不然服务器数据发过来,客户端收不到
hs79hs 2015-05-20
  • 打赏
  • 举报
回复
引用 9 楼 rightorwrong 的回复:
正常,用tcp播放
tcp太卡了,而且感觉直播流用tcp也不太适合 另外,vlc做服务器好像还没实现rtp over rtsp,Darwin倒是可以
rightorwrong 2015-05-20
  • 打赏
  • 举报
回复
正常,用tcp播放
hs79hs 2015-05-19
  • 打赏
  • 举报
回复
继续等高手解答 因为客户端vlc在SETUP后会向服务器发送的两包rtp和rtcp,目的应该是为了NAT打洞,俺准备修改服务器端的vlc(应该是调用的live555)源码,在SETUP后接收其后的rtp包,然后用其源udp端口替代原来rtsp SETUP协商的端口,这样应该就能穿透NAT了,如果大家有更好的方法请不吝赐教。 没有选STUN因为要动客户端的vlc源码,而我只希望动服务器的,客户端尽量保持不动,这样以后任何player都可以访问。
hs79hs 2015-05-18
  • 打赏
  • 举报
回复
引用 5 楼 flying8127 的回复:
估计是这个造成的,因为指定的是内网端口,而不是NAT映射后的外网端口。 你家的可以,是因为NAT在进行端口映射时刚好是内网端口和外网端口相等,有的人想的解决方法是先采用STUN协议获取自己的外网IP和端口,然后用这个端口进行SETUP
看了stun协议,好像可以解决这个问题,但vlc没提供这个功能,需要改源码,是不是有更简单的方法? 我在AWS RHEL7上装了个Darwin,结果差不多,rtp over udp不能播放,但rtp over tcp可以播放,就是卡的厉害,因为用tcp的原因。 按说内网与外网通信NAT也是很正常的,就是想不通为什么大部分环境都可以播放,就这个宽带通的播不了,而且网上找的那个地址一样的环境也可以播放,有没有人搭建过公网rtsp服务器的来指点下啊
hs79hs 2015-05-18
  • 打赏
  • 举报
回复
引用 4 楼 flying8127 的回复:
RTP是over udp的话,这个应该是收不到RTP包的,因为UDP还没穿透,为什么你家的可以,奇怪……
谢谢回复,我家是联通ADSL,另外请两个朋友在他们家试,也可以播放,其中一个朋友还在美国:) 播放不了的这个用的是宽带通ADSL,按说打开路由器RTSP ALG功能不就可以对rtsp协议中使用的端口进行解析吗? 为什么那个网上找的rtsp测试地址可以播放呢?抓包看播放时也没有多余的包进行端口协商啥的啊 如果关闭ALG功能这个rtsp地址也不能播放,证明alg还是起作用的
flying8127 2015-05-16
  • 打赏
  • 举报
回复
rtsp在SETUP会话时分别指定了服务器和客户端rtp和rtcp通信时要用到的端口号 --------------- 估计是这个造成的,因为指定的是内网端口,而不是NAT映射后的外网端口。 你家的可以,是因为NAT在进行端口映射时刚好是内网端口和外网端口相等,有的人想的解决方法是先采用STUN协议获取自己的外网IP和端口,然后用这个端口进行SETUP
flying8127 2015-05-16
  • 打赏
  • 举报
回复
PLAY会话后服务器也不停向客户端发送视频流和音频流的rtp包了,但内网机器却抓不到rtp包 ---------------------------- RTP是over udp的话,这个应该是收不到RTP包的,因为UDP还没穿透,为什么你家的可以,奇怪……
hs79hs 2015-05-15
  • 打赏
  • 举报
回复
抓包看了两种情况下的sdp,没看出有指定端口啥的区别,可用的那个rtsp链接是darwin服务器,我的是vlc服务器,难道还得装个darwin试试?
hs79hs 2015-05-14
  • 打赏
  • 举报
回复
跟ALG有关吗,我在自己的路由器上设了打开ALG也没有效果,用的是宽带通,是不是出口的路由器没有打开ALG?
hs79hs 2015-05-14
  • 打赏
  • 举报
回复
高手快来啊~~~ 似乎又不是ALG的问题,我试了网上找的rtsp测试地址,下面这个可以播放: rtsp://218.204.223.237:554/live/1/67A7572844E51A64/f68g2mj7wjua3la7.sdp 为什么我的服务器的rtsp流播放不了呢? 是不是sdp文件里可以设置端口号?我没写过sdp,用vlm做点播服务器时sdp是vlc自己生成的吗?我的vlm配置文件: #new vod4 vod enabled #setup vod4 input /home/ec2-user/videos/live1.ts vlc启动命令: cvlc --color -I telnet --telnet-password test --rtsp-port 8554 --vlm-conf vlm.conf
  1、支持国标GB28181平台、国标GB28181 IPC和国标GB28181 NVR设备同时接入 (支持GB28181-2011版本和GB28181-2016版本)     2、支持国标GB28181设备注册和注销,对所有设备进行管理,获取资源 对资源列表进行管理     3、支持国标GB28181的目录订阅,对接收的订阅通知进行处理     4、支持国标GB28181实时视频请求(支持UDP、TCP主动(tcpactive)、TCP被动(tcppassive))     5、支持国标GB28181 PTZ控制     6、支持国标GB28181 录像查询     7、支持国标GB28181 历史视频点播 (支持UDP、TCP主动(tcpactive)、TCP被动(tcppassive))     8、支持国标GB28181 历史视频下载 (支持UDP、TCP主动(tcpactive)、TCP被动(tcppassive))     9、支持对接收的国标实时视频码和历史视频码进行管理     10、支持将国标的PS码转换成ES码     11、支持丢包打印和断打印     13、支持RTSP服务和RTSP会话管理     14、支持RTSP客户端 UDP传输和TCP传输     15、支持国标GB28181设备5000路左右的接入管理,支持国标请求视频在100路左右     16、支持国标28181设备和通道写入mysql数据库      17、支持设备的云台PTZ控制,控制类型:上"up",下"down",左"left",右"right",左上"leftup",左下"leftdown",右上"rightup",右下"rightdown",镜头近"zoomin",镜头远"zoomout", 焦距远"focusfar",焦距近"focusnear", 设置预置位"setpos",调预置位"callpos"     18、支持历史视频的查询和历史视频的点播控制     19、支持对国标设备的控制,"record":录像开启和停止-通道id "guard":布放和撤防-报警通道id "reboot":设备重启-设备id "keyfame":强制关键帧-通道id     20、支持对实时视频的图片截图,通过http直接访问图片    21、支持rtmp和hls会话一直保留    22、支持报警消息(设备上线、下线和设备端报警)通过httpclient方式主动通知    23、支持公网和局域网同时存在    24、支持httpserver,接口支持http+json    25、支持设备上线、下线和设备报警通过httpclient通知到指定的httpserver   26、支持http+json设置平台信息  27、支持http+json获取资源组、资源等信息  29、支持国标28181级联上级

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧