RTSP协议网络摄像头接入视频平台EasyNVR
时间:2022-07-23
本文章向大家介绍RTSP协议网络摄像头接入视频平台EasyNVR,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
了解TSINGSEE青犀视频产品的用户都知道,作为专注于音视频流媒体行业的研发团队,我们一直都在追求更前沿的技术,比如H265接入与播放、比如在能力平台上叠加上业务功能,如:用户管理、设备管理等。最近我们就对RTSP协议网络摄像头接入视频平台EasyNVR进行了一次功能的迭代更新,升级后界面直播,视频编码兼容性更强,同时也增加了用户管理功能。有此功能需求的用户可以官网下载更新啦。
新版EasyNVR用户管理不仅能够添加角色,分配设备,当用户或者角色过多时,还能将用户/角色下载表格,表格里对应了用户的通道、密码,对用户及设备进行表格管理,让运营者获取数据更加便捷。
这个功能刚上线时,我们内部对此做了一系列的测试,并且随后又添加了用户的邮箱和手机号,便于查找。但在测试的时候,发现EasyNVR导出的用户excel表格里,新增的邮箱和手机号并没有被导出,导出的内容还是旧数据。
我考虑可能是接口调用的代码错误,于是从EasyNVR导出excel接口开始排查错误:
users := make([]*models.User, 0)
models.DB.Table("user").Order("id").Find(&users)
for i := 0; i < len(users); i++ {
user := users[i]
row := userSheet.AddRow()
row.SetHeightCM(1)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%v", user.ID)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%v", user.Name)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%v", user.Username)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%s", user.Password)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%v", user.Role)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%v", user.Phone)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%v", user.Email)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%s", user.Reserve1)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%s", user.Reserve2)
}
上面实际上在理论上是没有问题的,但是新版的EasyNVR多出了角色、角色设备、分组、分组设备,于是我们需要把这些详细内容都添加进导出代码。
//用户角色表
userRoles := make([]*models.UserRole, 0)
models.DB.Table("user_roles").Order("id").Find(&userRoles)
for i := 0; i < len(userRoles); i++ {
userRole := userRoles[i]
row := userRoleSheet.AddRow()
row.SetHeightCM(1)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%d", userRole.Id)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%d", userRole.Uid)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%d", userRole.Rid)
}
//角色表
roles := make([]*models.Role, 0)
models.DB.Table("roles").Order("id").Find(&roles)
for i := 0; i < len(roles); i++ {
role := roles[i]
row := roleSheet.AddRow()
row.SetHeightCM(1)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%d", role.ID)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%s", role.Name)
}
//角色设备表
roleCameras := make([]*models.RoleCamera, 0)
models.DB.Table("role_camera").Order("role_id").Find(&roleCameras)
for i := 0; i < len(roleCameras); i++ {
roleCamera := roleCameras[i]
row := roleCameraSheet.AddRow()
row.SetHeightCM(1)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%d", roleCamera.RoleId)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%s", roleCamera.CameraId)
}
//分组表
labels := make([]*models.Label, 0)
models.DB.Table("label").Order("id").Find(&labels)
for i := 0; i < len(labels); i++ {
label := labels[i]
row := labelSheet.AddRow()
row.SetHeightCM(1)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%d", label.ID)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%s", label.Name)
}
//分组设备表
labelCameras := make([]*models.LabelCamera, 0)
models.DB.Table("label_camera").Order("label_id").Find(&labelCameras)
for i := 0; i < len(labelCameras); i++ {
labelCamera := labelCameras[i]
row := labelCameraSheet.AddRow()
row.SetHeightCM(1)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%d", labelCamera.LabelId)
cell = row.AddCell()
cell.Value = fmt.Sprintf("%s", labelCamera.CameraId)
}
在代码中将内容信息补全后,再次导出,就可以发现新增内容都添加完善了。
EasyNVR视频平台播放界面:
- Leetcode-Easy21. Merge Two Sorted ListsDefinition for singly-linked list.class ListNode:def init(sel
- Burp Suite详细使用教程-Intruder模块详解
- 逆元的三种解法(附详细证明)
- JavaScript设计模式与开发实践 - 单例模式
- Leetcode-Easy 141. Linked List Cycle
- 【DataMagic】如何在万亿级别规模的数据量上使用Spark
- 51nod1004 n^n的末位数字
- Leetcode-Easy 20. Valid Parentheses
- Leetcode-Easy 234. Palindrome Linked List
- 为什么是link-visited-hover-active
- 51Nod 1051 最大子矩阵和
- Javascript之创建对象
- Leetcode-Easy 136. Single Number
- 2017.10.25水题大作战题解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- markdown mermaid 画图
- 面试汇总(五):操作系统常见面试总结(一):进程与线程的相关知识点
- 面试汇总(六):操作系统常见面试总结(二):系统相关的问题
- Android 利用V4L2 调用camera
- Android基础--利用ANativeWindow显示视频
- Python如何爬取b站热门视频并导入Excel
- 代码详解——改变控制器的参考速度
- Python爬虫之JS的解析
- Python爬虫之chrome在爬虫中的使用
- Python爬虫之打码平台的使用
- Python爬虫---爬取腾讯动漫全站漫画
- Python爬虫之数据提取-selenium的其它使用方法
- Python爬虫之数据提取-selenium定位获取标签对象并提取数据
- Python爬虫之数据提取-selenium的介绍
- MVC中的引用缺少问题