当前位置:   article > 正文

RTSP客户端接收H264的RTP包并解析遇到的问题_rtsp流无法解析出pps信息怎么办

rtsp流无法解析出pps信息怎么办

关于RTSP怎么握手,RTP包和H264的格式网上已经很多了,我就不赘述了。只说一下在做这个客户端的时候遇到的问题。说明下,我的客户端代码是从ffmpeg里面提取出来的。


1、发送PLAY命令后,服务端抓包显示已经在发数据了,但是客户端似乎没收到数据。 

经过仔细检查后发现,ffmpeg的rtp.h里面有个宏限制了接收到rtp包的大小为1500字节,但是抓包发现客户端发送的最小包是8000+字节。对于这种情况,ffmpeg的做法是丢掉超过限制大小的包,这样就造成了服务端一直在发数据,而客户端就是没数据的情况。这样也看出服务端是非常规的。把1500改成大于服务端最大数据包的大小即可。

2、发送TEARDOWN命令后,服务端还在发音频数据,视频数据已经停止发送了。

不知道服务端是什么情况,收到此请求只关闭了视频发送线程。我的解决办法是发送TEARDOWN后客户端就直接关闭socket,而不去等待是否返回200 OK。

3、解析出payload以后直接写成H264不可以播放或者播放花屏。

服务端在发送H264的时候去掉了开始码0x00 0x00 0x00 0x01,所以解析出payload后要在每个完整帧前加上此开始码。当然,这还是不够的,还要解析出sps和pps信息,加到关键帧的前面,sps和pps前面都要加上开始码,pps后面接关键帧,关键帧前面也要有开始码。最重要的是,要把关键帧的payload的第一个字节的高3位和第二个字节的低5位组合成一个字节,这个字节就是nal类型。如果不这样做,播放的图像就是绿屏的。

4、非常规服务器引发的问题。

1>sdp信息中a='control:xxxxx'这个描述信息,有些服务器会在里面带上rtsp地址,所以客户端在SETUP的时候一定要判断一下trackID前面是否有rtsp://这样的字符,不然SETUP请求会出错或者PLAY请求后服务端不发送数据。

2>有些服务端只在sdp信息中返回sps和pps信息,有些会在每帧关键帧前面发一次sps和pps信息。对于前者要把a='fmtp:96 packetization-mode=1;profile-level-id=xxxxxx;sprop-parameter-sets=xxxxxxxxx'中的profile-level-id=xxxxxx;sprop-parameter-sets=xxxxxxxxx等号后面的数据进行BASE64解码,得到的就是sps和pps。对于后者就是payload。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/157421
推荐阅读
相关标签
  

闽ICP备14008679号