NVR对接三方相机预览黑屏问题案例

一、 问题现象
【问题现象】NVR接入三方相机,通道状态显示在线,但本地、web预览显示黑屏。更换H.264,H.265均预览黑屏,且NVR侧的萤石云手机APP预览报错260025。
【现场拓扑】现场拓扑如下
(1) IPC使用onvif协议添加至NVR,NVR通过光猫跨公网注册至萤石云。
(2) IPC也通过光猫跨公网注册至萤石云。
(3) IPC及NVR在同一局域网下
在这里插入图片描述
图1.1:网络拓扑
二、 问题排查过程
此问题可以归类与三方相机对接问题,onvif的本质就是HTTP协商+RTSP取流,所以可以使用VLC同时取相机流测试。
1、NVR异常时使用VLC取流测试
使用VLC取预览流测试结果如下
(1)时间进度条正常走动,但VLC不显示画面。
上述的测试证明相机发流存在问题,但仍需进一步定位问题原因。
2、简化网络环境
(1)因相机侧单独添加到萤石云上,同时又被添加至NVR,问题本质是NVR无法预览相机。
(2)所以可先删除萤石云上单独添加的相机,只保留NVR这一路取流,排除其他可能的影响条件,进一步排查问题。
(3)当萤石云APP上删除ipc后,此时发现,NVR本地、web预览正常
3、抓包分析
所以目前需要找出IPC单独添加到萤石云APP后NVR预览IPC画面显示黑屏的原因。
(1)异常期间抓包分析。
在这里插入图片描述

图2.1:异常期间抓包分析
从图2.1可看出,异常期间相机是与录像机之间是正常协商且正常推流的,而且并无丢包现象,此时排除了相机取流路数上限以及网络环境问题。但是实际上录像机预览依然黑屏。
(2)异常情况下与正常情况下抓包追踪流对比。
在这里插入图片描述
图2.2:异常期间流追踪
在这里插入图片描述
图2.3:正常期间流追踪
由图2.2及图2.3可看出,设备侧正常及异常情况下 RTSP协商的码流类型均为H.264。
由上两图可看出,设备侧在RTSP报文协商阶段并无问题。
(3)异常情况下与正常情况下相机推流对比。
在这里插入图片描述
图2.4:异常推流报文
在这里插入图片描述
图2.5:正常推流报文
通过Payload字段分析
(1) 异常期间设备侧收到的码流实际为H.265,但是由图2.2可得出RTSP协商时码流协商类型为H.264。
(2) 正常期间设备收到的码流类型为H.264,从图2.3也可得知RTSP协商时码流协商类型为H.264。
三、 问题原因
萤石相机单独添加萤石云后,主机RTSP取流协商推流为H.264实际推流为H.265,导致NVR解码失败,预览黑屏。
PS:
(1)H.264格式Payload字段前两位一般为 67/68
(2)H.265格式Payload字段前两位一般为 40/42/44
四、 附录
1.H.265的码流格式
1、H.265一个图像序列的组成:VPS+SPS+PPS+SEI+一个I帧+若干个P帧。VPS、SPS、PPS、SEI、一个I帧、一个P帧都可以称 为一个NALU。
2、H.265的NALU结构:开始码+NALU头+NALU数据
(1)开始码大小为四个字节,是一个固定值00 00 00 01(十六进制),标识一个NALU的开始。
(2)NALU头大小为两个字节,共16位,第1位值为0,第2-7位为NALU的type位(共6位),标识当前NALU的类型 ,第8-15位值为0,第16位值为1。
(3)NALU数据为编码器编出来的图像信息或图像数据。
3、六种类型的NALU
(1)VPS(视频参数集):NALU头值为0x40 01(十六进制),NALU头type位值为32(十进制)。
(2)SPS(序列参数集):NALU头值为0x42 01(十六进制),NALU头type位值为33(十进制)。
(3)PPS(图像参数集):NALU头值为0x44 01(十六进制),NALU头type位值为34(十进制)。
(4)SEI(补充增强信息):NALU头值为0x4e 01(十六进制),NALU头type位值为39(十进制)。
(5)I帧:NALU头值为0x26 01(十六进制),NALU头type位值为19(十进制)。
(6)P帧:NALU头值为0x02 01(十六进制),NALU头type位值为1(十进制)。
H.265 UDP码流payload字段分析例:
Payload:40:01:0c:01:ff:ff:21:60:00:00:03:00:00:03:00:00:03:00:00:03:00:96:ac:09
40:01—(二进制)---- 0100 0000 0000 0001
第一位:0
NalType:100 000 》32 =》VPS
LayerID:0 0000 0
》0
TID:001 ==》1

4、H.265的NALU打包成RTP包的模式(下面是用到的两种模式)
(1)一个NALU打包成一个RTP包,只需要在一个12字节的RTP包头后添加去掉开始码的NALU即可 (此问题中设备使用的方式)
(这种模式在一个NALU的大小小于MTU时使用)。
(2)一个NALU打包成几个RTP包(FUs模式),在12个字节的RTP头后面有两个字节的PayloadHdr和一个字节的FUheader。PayloadHdr的值等于NALU头的type位改为49(十进制)后的值,FUheader第1位标记RTP包是否为NALU的第一片,第2位标记RTP包是否为NALU的最后一片。后6位是NALU头的type位。
SDP参考:
h.265的VPS/SPS/PPS
(1)与分辨率有关
(2)与帧率无关(与帧率是否有关主要看sps中某个字段的值,
(3)与N/P制无关
1、4M
Payload: 40010c01ffff016000000300b00000030000030099aa0240
Payload: 420101016000000300b00000030000030099a001402005a1636aa4932f90
Payload: 4401c0f2f03c90
2、4M_4x3
Payload: 40010c01ffff016000000300b00000030000030099aa0240
Payload: 420101016000000300b00000030000030099a001202006c1636aa4932f90
Payload: 4401c0f2f03c90
3、3M
Payload: 40010c01ffff016000000300b00000030000030099aa0240
Payload: 420101016000000300b00000030000030099a00100200601636aa4932f90
Payload: 4401c0f2f03c90
4、1080P
Payload: 40010c01ffff016000000300b0000003000003007baa0240
Payload: 420101016000000300b0000003000003007ba003c08010e58daa924cbe40
Payload: 4401c0f2f03c90
5、960P
Payload: 40010c01ffff016000000300b0000003000003007baa0240
Payload: 420101016000000300b0000003000003007ba00280803c1636aa4932f9
Payload: 4401c0f2f03c90
6、720P
Payload: 40010c01ffff016000000300b0000003000003005daa0240
Payload: 420101016000000300b0000003000003005da00280802d1636aa4932f9
Payload: 4401c0f2f03c90
7、D1
Payload: 40010c01ffff016000000300b0000003000003005aaa0240
Payload: 420101016000000300b0000003000003005aa00582009058daa924cbe4
Payload: 4401c0f2f03c90
8、CIF
Payload: 40010c01ffff016000000300b0000003000003003caa0240
Payload: 420101016000000300b0000003000003003ca00b0804858daa924cbe40
Payload: 4401c0f2f03c90
2.H.264的码流类型判断
(1)NAL的封装方式:
    NAL是将每一帧数据写入到一个NAL单元中,进行传输或存储的
    NALU分为NAL头和NAL体
    NALU头通常为00 00 00 01,作为一个新的NALU的起始标识
    NALU体封装着VCL编码后的信息或者其他信息
(2)NAL的封装过程:
I帧、P帧、B帧都是被封装成一个或者多个NALU进行传输或者存储
每一个I帧开始之前也有非VCL的NAL单元,用于保存其他信息,它们是PPS、SPS
  PPS(Picture Parameter Sets):图像参数集
  SPS(Sequence Parameter Set):序列参数集
  在实际的H.264数据帧中,往往帧前面带有00 00 00 01 或 00 00 01分隔符,一般来说编码器编出的首帧数据为PPS与SPS,接着为I帧,后续是B帧、P帧等数据。
H.264的判断方法可以参考H.265,注意报文中如下帧的参数即可。
SPS:0X67、PPS:0X68、I帧:0X65、P帧:0X41

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/336438.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全局配置-案例:配置tabBar

一、需求:实现如图所示的tabBar效果 二、实现步骤: 1.拷贝图标资源 把image文件夹拷贝到小程序项目根目录中 图片中包含-active的是选中之后的图标 图片中不包含-active的是默认图标 2.新建3个对应的tab页面 3.配置tabBar选项 (1&#xf…

【本地运行chatgpt-web】启动前端项目和service服务端项目,也是使用nodejs进行开发的。两个都运行成功才可以使用!

1,启动web界面 https://github.com/Chanzhaoyu/chatgpt-web#node https://nodejs.org/en/download/package-manager # 使用nvm 安装最新的 20 版本。 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source /root/.bashrc n…

MVS net笔记和理解

文章目录 传统的方法有什么缺陷吗?MVSnet深度的预估 传统的方法有什么缺陷吗? 传统的mvs算法它对图像的光照要求相对较高,但是在实际中要保证照片的光照效果很好是很难的。所以传统算法对镜面反射,白墙这种的重建效果就比较差。 …

SSE(Server Sent Event) 踩坑留念

整条链路是 客户端A --> 服务端 A —> 服务端 B 我负责服务端 A 此时要注意 Client 中的 processes 的写法 Post(value “/v2/xx”, processes MediaType.TEXT_EVENT_STREAM) 这样写是一直报错的 改成下面的写法才可以 Post(value “/v2/xx”, processes MediaT…

看看最新的B端登录界面,你是不是被潮流抛弃了?

毛玻璃风格(Frosted Glass Style)是新拟态设计风格中的一种分支,它灵感来源于现实世界中的毛玻璃材质。毛玻璃是一种通过在玻璃表面加工处理的方式,使其具有模糊、云翳和透明效果的特殊玻璃。 在设计中,毛玻璃风格通常…

WPF中CommandParameter用法

1. 界面样式 2. XAML中代码部分 <ButtonGrid.Row"0"Grid.Column"1"Command"{Binding BtnClick_Number}"CommandParameter"7"Content"7"Style"{StaticResource BtnStyle_Num}" /> <ButtonGrid.Row"…

华发股份:加强业务协同 新政下项目热销

“5.17”楼市政策出台后&#xff0c;各地密集落地执行。5月27—28日&#xff0c;上海、广州、深圳三个一线城市跟进落地“517”新政。上海发布《关于优化本市房地产市场平稳健康发展政策措施的通知》&#xff0c;共计9条调整政策&#xff0c;涵盖外地户籍、人才、单身、婚否、企…

Python数据处理,使用 tkinter 模块点击获取文件目录

Python数据处理&#xff0c;使用 tkinter 模块点击获取文件目录 正文 正文 当我们进行数据处理读取文件内数据的时候&#xff0c;通常&#xff0c;我们需要设定好一个存放当前文件所在目录的变量。比如如下目录&#xff1a; file_path rC:\Users\xxx\Desktop\DataSet\Data.c…

【OrangePi AIpro】开箱初体验以及OAK深度相机测试

1. 简介 Orangepi AIPRO 是一款采用昇腾AI技术路线&#xff0c;集成4核64位处理器AI处理器的单板计算机&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接eMMC模块&#xff0c;支持双4K高清输出。 Orange Pi AIpr…

Docker-一文详解容器通信的基础网络模式及衍生的自定义网络模式

启动容器时&#xff0c;通过-p 宿主机端口:容器端口&#xff0c;就可以通过访问宿主机端口访问到容器&#xff0c;这种原理机制是啥&#xff0c;有没有其它方式可以让宿主机和容器通信&#xff0c;以及容器与容器之间如何通信。带着这几个问题开始学习Docker的网络知识。 文章…

0.25W 1.5KVDC~3KVDC 隔离超小型单输出 DC/DC 电源模块——TKE-W25系列

TKE-W25系列隔离超小型单输出 DC/DC 电源模块是一款超小型单输出电源模块&#xff0c;工业级环境温度&#xff0c;用于PCB安装的国际标准结构。此系列产品小巧&#xff0c;效率高&#xff0c;低输出纹波,用于需要电压转换和隔离的场合&#xff0c;封装有SIP和DIP可选。

英语学习笔记29——Come in, Amy!

Come in, Amy! 进来&#xff0c;艾米&#xff01; shut v. 关严 区别&#xff1a;shut the door 把门关紧 口语&#xff1a;Shut up! 闭嘴&#xff01;    态度强硬&#xff0c;不礼貌 例句&#xff1a;请不要把门关严。    Don’t shut the door, please. bedroom n. …

AlexNet,LeNet-5,ResNet,VGG-19,VGG-16模型

模型 AlexNet导入必要的库&#xff1a;加载类别名称&#xff1a;创建标签映射字典&#xff1a;加载图像数据和对应的标签&#xff1a;构建AlexNet模型&#xff1a;编译模型&#xff1a;训练模型&#xff1a; LeNet-5导入必要的库&#xff1a;加载类别名称&#xff1a;创建标签映…

Hadoop概览以及编译hadoop说明

一、Hadoop概述 Hadoop 是一个用于跨计算机集群存储和处理大型数据集的软件框架。它旨在处理大数据&#xff0c;即传统数据库无法有效管理的极其庞大和复杂的数据集。Hadoop不是传统意义上的数据仓库&#xff0c;因为它们的用途不同&#xff0c;架构也不同。Hadoop 是一个跨分布…

在Visual Studio Code和Visual Studio 2022下配置Clang-Format,格式化成Google C++ Style

项目开发要求好的编写代码格式规范&#xff0c;常用的是根据Google C Style Guide 网上查了很多博文&#xff0c;都不太一样有的也跑不起来&#xff0c;通过尝试之后&#xff0c;自己可算折腾好了&#xff0c;整理一下过程 背景&#xff1a; 编译器主要有三部分&#xff1a;前…

Django 里如何使用 sqlite (操作步骤)

在 settings.py 里&#xff0c;已经设定好 sqlite 了 DATABASES {default: {ENGINE: django.db.backends.sqlite3,NAME: BASE_DIR / db.sqlite3,} }必须得设置好app # 在 settings.py 里INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contentt…

科技产业园3D探秘:未来科技之城的奇幻之旅

在数字时代的浪潮中&#xff0c;科技产业园区成为了推动城市经济发展、科技创新的重要引擎。 当我们打开科技产业园的3D可视化模型&#xff0c;仿佛穿越时空&#xff0c;来到了一个充满奇幻色彩的科技世界。在这里&#xff0c;高楼大厦鳞次栉比&#xff0c;绿色植被点缀其间&am…

React(四)memo、useCallback、useMemo Hook

目录 (一)memo API 1.先想一个情景 2.用法 (1)props传入普通数据类型的情况 (2)props传入对象的情况 (3)props传入函数的情况 (4)使用自定义比较函数 3.什么时候使用memo&#xff1f; (二)useMemo Hook 1.用法 2.useMemo实现组件记忆化 3.useMemo实现函数记忆化 …

记录jenkins中解决sqlite3报错的问题

参考博客python系列--Python3 No module named _sqlite3错误 - 知乎 安装sqlite3 2.1 下载sqlite3安装包 官网地址SQLite Download Page 下载安装包:wget https://www.sqlite.org/2024/sqlite-autoconf-3460000.tar.gz 2.2 上传服务器并进行安装 解压&#xff1a;tar -xv…

【运维】Linux 端口管理实用指南,扫描端口占用

在 Linux 系统中&#xff0c;你可以使用以下几种方法来查看当前被占用的端口&#xff0c;并检查 7860 到 7870 之间的端口&#xff1a; 推荐命令&#xff1a; sudo lsof -i :7860-7870方法一&#xff1a;使用 netstat 命令 sudo netstat -tuln | grep :78[6-7][0-9]这个命令…