Android 播放rtsp流, 在内网可以播放,在外网环境不可以播放情况的分析

在公司一个项目中需要在android端上到媒体服务器上通过rtsp取流,由于媒体服务器统一的去前端网络摄像机取流,导致媒体服务器和和前端网络摄像机处于同一局域网内,项目需要在外网中播放视频,媒体服务器的rtsp端口554在公司路由器中已经成功的映射出去。

 项目开发都是在局域网中,取流这些都是正常的视频的延迟也在可接受的范围内,也让朋友(老毛)拿着他的IPhone通过4G和wifi 在vlc上取rtsp流,

一切都是正常的(假象),交付测试反馈给我的是在外网环境下无法播放rtsp流。下面就介绍一下我的分析思路:

拿到这个BUG,用了楼下公司的免费wifi做测试环境(大家都懂的!)。  我在想我是用ffmpeg接受rtsp流的,在android上用vlc取这个流能不能取到呢??答案是不能。。。但是PC上的vlc是可以的,这是什么情况??懵逼中。。。不管了,先抓包啦!通过WireShark抓包,想要抓手机的包就只能通过中转代理了,为了不打乱网络拓扑结构 只能通过tcpdump 抓包了,虽然这不是实时的。下图是android中通过ffmpeg播放rtsp的包


rtsp的流程都是对的,服务器的响应也是对的。但就是没有收到rtp数据流,客户端收到了服务器的PLAY响应后,大概过了10s客户端发送了个PAUSE,这应该是做的个反馈机制。之前也知道也预留了rtp的承载方式的(UDP TCP),使用udp的时候SETUP中的turnsport字段中会带上rtp 和 rtsp的端口,服务器响应也会给客户端反馈响应的端口,由于tcp承载方式不会开端口,而是通过interleaved (交织的方式)(当时分析的时候这点没想到他们之前的区别)


 interleaved-0 和1分别表示rtp 和rtsp。所以tcp的承载方式他的端口即使是在内网环境下,路由器映射到外网的端口是不会被改变的,而udp的承载方式由于SETUP中会带端口,导致路由器映射的时时候端口会发生变化。而在我的项目中ffmepg默认的承载方式是udp,导致在内网环境中端口不会发生变化,但在外网情况则会发生变化,果不其然我改变了truansport的方式为tcp后就可以在外网环境下成功的收到rtp数据流了(播放成功)。下片文章我讲继续说明在udp承载方式下,怎么让rtp包成功穿透内网。


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值