首页 > 音视频 > vlc播放rtsp over tcp画面突然卡住问题
2018
12-23

vlc播放rtsp over tcp画面突然卡住问题

继完成rtmp服务器开发后,最近也写完了rtsp服务器,可以将国标ps流以及其他格式协议码流转rtsp协议输出。中间开发过程用了许多播放器测试,最常用的就是vlc。使用vlc测试过程,遇到了许多问题。今天就记录一个比较奇怪的问题。

使用rtp over udp模式播放时,没出现问题,但是使用rtp over tcp模式时,vlc播放几十秒后画面突然卡住不动了,看了vlc 的debug message没发现异常。用ffplay,live555,potplayer测了都没异常。后面换了不同版本vlc测试,更奇怪了,vlc3.0.0以及之前,3.0.5以及之后版本都正常。应该是vlc对rtp over tcp做了特殊处理。此时抓包分析rtsp交互数据,发现出现问题版本的vlc每隔一定时间除了会发送OPTIONS命令,然后还有以’$’开头的一串特殊字节,发送完这个播放画面就卡住了。为什么会卡住不播放了呢?只能看vlc源码查找问题了。

通过阅读相关源码,终于定位到了原因。这个是vlc的keep-alive机制造成的。由于vlc使用了live555做rtsp处理,所以对应处理代码在modules/access/live555.cpp这个文件里。下面结合代码说下原因。

如上函数是vlc的rtsp超时处理代码,出现问题的vlc版本没有

这两行代码,我们先把这两行代码注释,分析下为什么会出现播放画面突然不动的现象。
1)rtsp交互开始vlc客户端会发送OPTIONS请求,我们服务器需要回应支持的方法。如果我们服务器回应包括GET_PARAMETER方法(可选),use_get_param就为true,然后keep-alive机制就会定时sendGetParameterCommand,否则sendOptionsCommand,我这边服务没去做GET_PARAMETER方法的支持,所以会定时收到vlc发的OPTIONS命令请求。vlc发送完OPTIONS请求命令后,开始wait_Live555_response(p_demux)。看下这个函数:

传入的参数中i_timeout为默认值0,所以没有超时时间,会一直等服务器响应请求。
2)我这边服务器有个命令解析类,只处理标准的命令(OPTIONS,DESCRIBE,PLAY等)。由于vlc会定时发送’$’开头数据,跟OPTIONS请求数据混在一起送到我的命令解析里,导致我这边没能正确解析,所以也没有回应vlc keep-alive机制的OPTIONS请求。我们再看下TimeoutPrevention函数,该函数进入后会:

由于我的服务器没有回应OPTIONS请求,所以这个锁会一直阻塞,我们看下这个锁用在哪个地方:

可知由于TimeoutPrevention一直阻塞,所以Demux过程不能执行了,所以播放画面不动了。

新版vlc已经通过

取消了rtp over tcp的keep-alive机制,所以3.0.5以及之后版本没有出现问题。我的rtsp服务器后面也针对’$’开头数据做了处理,测了下,一切都正常了。

‘$’开头数据是做什么的呢?在我服务器发RTCP数据时才用到,没想到客户端也有类似机制。在rfc2326中,’$'(0x24)开头数据叫做:Embedded (Interleaved) Binary Data,称为嵌入式二进制数据。测试的那么多播放器,只有vlc实现了这个。而且这个Embedded (Interleaved) Binary Data只工作在rtp over tcp下。这个数据有什么作用呢?rfx2326 10.12这么介绍的:

rtp over tcp模式下,就一个socket端口进行命令控制以及流传输,不像rtp over udp,另开udp socket传输数据。由于防火墙以及其他外部因素,可能造成rtsp方法与rtp流数据交织混在一起。为了避免这个,才有这个设计。通过:

对控制信息以及流数据进行区分。具体介绍可以参考:
RTP over RTSP包混合发送的解决办法:https://blog.csdn.net/myslq/article/details/79819179

由于Embedded (Interleaved) Binary Data是在是在服务器回应PLAY推流后vlc才这样处理的,我这边没注意到,所以导致解析出现错误。不过除了vlc,其他播放器都没支持Embedded (Interleaved) Binary Data,因为推流是服务器端,前面命令交互完,服务器就开始推流了,对于客户端我觉得用处不大。

最后编辑:
作者:Jeff
Avatar
管理员——代码为剑,如痴如醉

留下一个回复

你的email不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.