RTSP客户端接收H264的RTP包并解析遇到的问题

关于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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值