2019-09-27 使用live555 做rtspclient

RtspClientTask负责管理rtspclient,每个rtspclient都会创建新的线程,rtspclient 使用live555开源库。
取流后需要简单封装数据,h264需提取sps 和 pps 给解码器使用,最好是将sps pps I帧 封装在一起送给解码器。按照如下格式00 00 00 01+ sps+00 00 00 01 +pps+00 00 00 01 + i帧+ 00 00 00 01 +p帧,Sps 和 pps 只需传入一次就行(后续无变动)。
h265需提取vps,sps,pps,按照如下格式00 00 00 01+vps+00 00 00 01+sps+00 00 00 01+pps+00 00 00 01+i帧+00 00 00 01 + p帧。
Vps sps pps 均是rtspclient 发送describe请求后,rtspserver回复的sdp中带的。

代码比较简单 主要在这个回调中 实现自己的封装媒体流方式 DummySink::afterGettingFrame

最好是等I帧过来后,再获取vps sps pps,有些解码器容错能力并不是很强,这样封装更好点。

vps sps pps通过live555 如下接口获取
SPropRecord* sPropRecords[3];
unsigned numSPropRecords[3];
sPropRecords[0] = parseSPropParameterSets(fSubsession.fmtp_spropvps(), numSPropRecords[0]);
sPropRecords[1] = parseSPropParameterSets(fSubsession.fmtp_spropsps(), numSPropRecords[1]);
sPropRecords[2] = parseSPropParameterSets(fSubsession.fmtp_sproppps(), numSPropRecords[2]);
264中I帧用如下方式判断
(fReceiveBuffer[0] & 0x1F) == 5
265中i帧用如下方式判断
((fReceiveBuffer[0] & 0x7E) >> 1) == 19
详细可以看下标准协议 。

实际测试下来看大华摄像头h265回复的sdp中带了vps。Hik和宇视的sdp中都未带vps。有点奇怪,正在分析中。

你可能感兴趣的:(2019-09-27 使用live555 做rtspclient)