问题背景本周,业务研发的小伙伴们遇到了一件让人抓狂的事:在监控某国内知名IPC时,客户端一直显示黑屏。客户尝试了各种“传统大法”,从重启设备到更换网络,再到调整分辨率,结果还是徒劳无功。黑屏问题不仅让客户心急如焚,还严重影响了他们的正常监控工作,急需找到原因并解决。
研发团队的小伙伴们绞尽脑汁,查看了系统日志,发现系统一直在请求关键帧,但画面依旧杳无音信。就像你点了外卖,外卖小哥却一直在路上。于是,他们决定向我们求助,希望我们这群“代码医生”能妙手回春,解决这个棘手的问题。
我们接到求助后,立刻展开了“Debug模式”,准备从各个角度排查问题。毕竟,解决客户的问题是我们的使命,让黑屏消失、画面重现,就是我们最大的成就感!
过程分析
客户有提供了抓包和log,所以我们分别成抓包和log来分析:
(1)抓包排查,RTSP协议过程是没有问题的,整个交互还算正常
不过眼尖的小伙伴提供了一个怀疑点是,这款IPC发送的UDP数据包大小竟然是1502字节,已经超过了通常支持的最大1500字节的长度。所以他怀疑可能是因为这个原因,导致数据在传输过程中出现了问题,从而无法正常显示画面。
毕竟之前也碰到过类似问题:
但仔细想一下,如果是这原因,每个包差了几个字节,那无非是显示花屏,而不是完全黑屏呀。所以可以排除掉这个原因。
(2)之后又检查了一下RTSP SDP数据,以及是否有发送VPS,SPS,PPS数据。
之前也有遇到类似问题:
但是经过翻阅整个抓包,这部分也是正常发送,所以也排查了这个原因。
(3)我们还依次确认了编解码格式是否支持,payload type是否一致,发包端口是否匹配,渲染流程是否正常。目前就陷入僵局。
(4)当所有log和抓包都没有效果的时候,我们只能增加更多log,将关键流程中的各个参数输出,来确认问题了。经过几个回合的交互,最后定位到了问题。
根本原因
经过增加log,发现在RTP解封包时候,数据包帧类型搞错了,导致没有关键帧。但是抓包中确实存在关键帧。
log显示I帧数据包在做解析时,被错误地判断为P帧类型。而JitterBuffer在取关键帧送解码器时,查找整个队列获取不到正确的关键帧,所以系统一直在请求关键帧。
知道原因之后我们重新查看抓包,发现了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的数据,导致我们初步排查抓包并没有发现数据是对不上的,也是一个大坑呀。
解决方案
知道具体原因,我们增加了相关部分兼容,毕竟大部分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中列出的所有类型
补充知识2
个人习惯查阅其他优秀的代码,因为VLC PC端可以播放,所以就查阅了相关代码,具体实现如下:
vlc-mastermodulesstream_outrtpfmt.c
至此本文就分享结束,希望在对265解封包时候又遇到类似问题的,可以有个借鉴。
如果您在工作和学习过程中碰到解封包的错误或疑惑,欢迎评论区留言,或者加微信一起讨论。
我是一枚爱跑步的程序猿,维护公众号和知乎专栏《MediaStack》,有兴趣可以关注,一起学习音视频知识,时不时分享实战经验。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。