问题汇总–国内知名品牌IPC的兼容之旅

问题背景本周,业务研发的小伙伴们遇到了一件让人抓狂的事:在监控某国内知名IPC时,客户端一直显示黑屏。客户尝试了各种“传统大法”,从重启设备到更换网络,再到调整分辨率,结果还是徒劳无功。黑屏问题不仅让客户心急如焚,还严重影响了他们的正常监控工作,急需找到原因并解决。

研发团队的小伙伴们绞尽脑汁,查看了系统日志,发现系统一直在请求关键帧,但画面依旧杳无音信。就像你点了外卖,外卖小哥却一直在路上。于是,他们决定向我们求助,希望我们这群“代码医生”能妙手回春,解决这个棘手的问题。

我们接到求助后,立刻展开了“Debug模式”,准备从各个角度排查问题。毕竟,解决客户的问题是我们的使命,让黑屏消失、画面重现,就是我们最大的成就感!

问题汇总--国内知名品牌IPC的兼容之旅


过程分析

客户有提供了抓包和log,所以我们分别成抓包和log来分析:

(1)抓包排查,RTSP协议过程是没有问题的,整个交互还算正常

问题汇总--国内知名品牌IPC的兼容之旅

不过眼尖的小伙伴提供了一个怀疑点是,这款IPC发送的UDP数据包大小竟然是1502字节,已经超过了通常支持的最大1500字节的长度。所以他怀疑可能是因为这个原因,导致数据在传输过程中出现了问题,从而无法正常显示画面。

问题汇总--国内知名品牌IPC的兼容之旅

毕竟之前也碰到过类似问题:

问题汇总–兼容一个不合理的业务场景

但仔细想一下,如果是这原因,每个包差了几个字节,那无非是显示花屏,而不是完全黑屏呀。所以可以排除掉这个原因。

(2)之后又检查了一下RTSP SDP数据,以及是否有发送VPS,SPS,PPS数据。

之前也有遇到类似问题:

音视频问题汇总–SDP和编码参数

但是经过翻阅整个抓包,这部分也是正常发送,所以也排查了这个原因。

(3)我们还依次确认了编解码格式是否支持,payload type是否一致,发包端口是否匹配,渲染流程是否正常。目前就陷入僵局。

(4)当所有log和抓包都没有效果的时候,我们只能增加更多log,将关键流程中的各个参数输出,来确认问题了。经过几个回合的交互,最后定位到了问题。


根本原因

经过增加log,发现在RTP解封包时候,数据包帧类型搞错了,导致没有关键帧。但是抓包中确实存在关键帧。

问题汇总--国内知名品牌IPC的兼容之旅

log显示I帧数据包在做解析时,被错误地判断为P帧类型。而JitterBuffer在取关键帧送解码器时,查找整个队列获取不到正确的关键帧,所以系统一直在请求关键帧。

问题汇总--国内知名品牌IPC的兼容之旅

知道原因之后我们重新查看抓包,发现了root cause

一般情况下,H265I帧相比P帧都比较大,所以在发送时候,会进行FU切片封包。而正常的H265 FU-A封包时候,都会带一个FU 头,其中会包括start bit(1),end bit(1),以及nal unit type(6)。

在解封包时候,会通过&0x37的方式获取到Nal unit Type值,然后在判断该包是I帧,P帧,或者其他类型帧。

但是IPC发送的数据确实是0x26,经过&0x37处理后,naltpye变成了38(即0x26),这被识别为“filter data unit”(FD unit),导致程序直接过滤掉了这些数据,从而导致I帧缺失,最终引发客户端黑屏的问题。

Wireshark显示仍然是 RADL_N 6的数据,导致我们初步排查抓包并没有发现数据是对不上的,也是一个大坑呀。

问题汇总--国内知名品牌IPC的兼容之旅

解决方案

知道具体原因,我们增加了相关部分兼容,毕竟大部分FU单元存储的是I帧或者P帧数据,我们按照特定的方式重新获取帧类型,即可。


补充知识1

(1)H265 Nal unit Type

H265在发送端发送的时候会把视频数据打包成一个个小包裹,这些个包裹就被称作Nal Units。每个Nal Unit都有一个标签,告诉接收端里面装的是什么内容,而这个标签就被叫做Nal Unit Type。

想象一下,Nal Unit Type就像是包裹上的小贴纸,有的写着“关键帧”(IDR),有的写着“普通帧”(P-frame),还有的写着“参数集”(SPS、PPS)。

关键帧就像是电影的开头,必须有,否则前情后因都不知道,怎么刷剧;

普通帧就像是中间的剧情,没它也不是不行,剧情不连贯而已;

参数集就像是说明书,告诉你怎么解码这些视频数据。

查找了H265对应的spec,可以看到表7-1中列出的所有类型

问题汇总--国内知名品牌IPC的兼容之旅

补充知识2

个人习惯查阅其他优秀的代码,因为VLC PC端可以播放,所以就查阅了相关代码,具体实现如下:

vlc-mastermodulesstream_outrtpfmt.c

问题汇总--国内知名品牌IPC的兼容之旅

至此本文就分享结束,希望在对265解封包时候又遇到类似问题的,可以有个借鉴。

如果您在工作和学习过程中碰到解封包的错误或疑惑,欢迎评论区留言,或者加微信一起讨论。

我是一枚爱跑步的程序猿,维护公众号和知乎专栏《MediaStack》,有兴趣可以关注,一起学习音视频知识,时不时分享实战经验。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论