TSINGSEE青犀视频开发rtmp流推到Nginx rtmp模块报error appenging SPS/PPS NALs错误解析

大家知道TSINGSEE青犀视频云-边-端产品中不仅有EasyNVR视频边缘上云网关、EasyCVR视频融合共享平台等视频流媒体平台,还有很多视频服务的组件,比如EasyRTMP、EasyRTMPLive等推流组件。因此我们除了在研发更新视频平台外,也会不断进行组件的功能开发,不断实现安防视频全线产品的功能全覆盖。

Tsingsee.png

近期我们的研发团队在研发设备RTMP推流的时候,将rtmp流推到Nginx rtmp模块出现*2 hls: error appenging SPS/PPS NALs, client: 192.168.99.251, server: 0.0.0.0:10085 的报错,导致Nginx接收的rtmp流无法播放。

41.png

对此我们分析了log日志,从log显示看,Nginx在接收到推流端数据后,添加SPS PPS出现问题。通过log查询,此log出现在ngx_rtmp_hls_video中。

42.png

在获取IDR帧后,添加SPS和PPS信息。通过对RTMP协议的了解,我们知道在RTMP传输音视频的时候,传输IDR之前会先传输SPS和PPS。

再次通过抓包发现,设备发送了两次SPS和PPS。在AVCPacketType =0的时候发送了SPS以及PPS。这里发送SPS以及PPS都是正常的。但是此设备在接下的AVCPacketType = 1的时候也分两次发送了SPS以及PPS。

43.png

44.png

Nginx中ngx_rtmp_codec_av对于接收的RTMP数据进行解析,并且更新SPS,正常SPS只会发送一次,但是此设备发送了两次SPS和PPS。ngx_rtmp_codec_parse_avc_header_in_keyframe 函数中对于SPS以及PPS的解析要求必须是SPS与PPS是在一个数据包中同时发送的,否则会出现解析错误,从而出现添加SPS错误的log。

所以我们这里有两种解决方法,1、可以在此函数中添加判断,如果不包含SPS以及PPS则返回,不再进行赋值。2、设备端更新推流,在推流的时候只在AVCPacketType = 0的时候发送SPS和PPS。

这两种方法大家都可以自己尝试一下,同时我们也欢迎大家积极与我们沟通和交流技术上的问题,欢迎大家给我私信或者在博文下留言。如果大家还想了解更多视频相关的解决方案,也可以联系我们获取。