【C#】UDP接收摄像头PTZ数据并解析
前言
最近遇到一个需求,需要同步摄像机画面并在摄像机画面上叠加虚拟图像,有点虚拟演播室的需求。于是对摄像头Free-D协议传回的UDP协议进行解析。
参考文献
FreeD协议说明
大佬文章
设备和环境
硬件:Lumens VC-H717KN
Visual Studio(数据接收)
摄像机设置
按照说明书捣鼓捣鼓(不同摄像机设置不一样)
Lumens的话,通讯笔者的话,关闭NDI才能接收到FreeD协议传输的数据。不知道为什么会冲突,官方没说明。
UDP获取PTZ数据
UDP直接采集的数据是29字节的十六进制数据。
数据包一共有
29字节
(尖括号的内容为一字节), 包括了摄像机的八个参数数据,这八个参数主要包括摄像机的六个外部参数和两个内部参数。外部的六个参数为:摄像机的空间位置( x,y,z),摄像机自身水平(pan)、垂直(tilt)和自身旋转 (roll)的数值。内部两个参数包括摄像机镜头的缩放(zoom)和对焦(focus)数值。
<D1> 消息类型 <CA> 摄像机 ID <PH><PM><PL> 水平 Pan 角度 <TH><TM><TL> 垂直 Tilt 角度 <RH><RM><RL> 旋转 Roll 角度 <XH><XM><XL> 摄像机的 X 坐标 <YH><YM><YL> 摄像机的 Y 坐标 <HH><HM><HL> 摄像机的 H 坐标 (Z 坐标) <ZH><ZM><ZL> 缩放(zoom)数值 <FH><FM><FL> 对焦时的焦点(focus)数值 <SH><SL> 由用户保留,以做它用 <CK> 校验位
我们主要解析的是第三和第四项数据。
B.2 摄像机平移角度
摄像机平移角度定义为 Y 轴与摄像机光轴在水平 (XY) 平面上的投影之间的角度。零值
对应于相机在正 Y 方向上看和一个正值
表示向右平移(即从以上)。
该值以度数表示为 24 位二进制补码有符号数,其中最高有效位(位 23)是符号位,接下来的 8 位(位 22 到 15)是
整数部分和其余位(位 14 到 0)是小数部分;或者,
这可以被认为是一个以 1/32768 度为单位的有符号整数值。值的范围是从 -180.0 度(A60000 hex)到 +180.0 度(5A0000 hex)。
以水平Pan角度解析为例:
我测试过:直接按照官方解析会存在一定的偏差。
然后我就根据寻找规律,如下:
//将三位十六进制合并成一个完整的十六进制数
//转成2进制数,第0位为符号位 1表示正数 0表示负数 1010 1010 1111 1111 1111 1111
//负数直接转十进制除于32768 0101 0101 0000 0000 0000 0000
//正数去除符号位 得补码后转十进制除于32768 0011 0001 0011 0011 0011
具体实现,默认得到UDP中的三字节Pan的十六进制数据。
static void Main(string[] args){int[] num1 = DecToBin(170);int[] num2 = DecToBin(255);int[] num3 = DecToBin(255);int[] binSlice = SpliceBin(num1, num2, num3);//判断符号位正负 if (binSlice[0] == 0){double num = BinToDec(binSlice);Console.Write(-num);}else{//补码for (int i = 0; i < 24; i++){binSlice[i] = binSlice[i] == 0 ? 1 : 0;}int len = binSlice.Length;binSlice[len - 1] += 1;for (int i = 0; i < len; i++){if (binSlice[len - 1 - i] > 1){binSlice[len - 1 - i] = 0;binSlice[len - i] += 1;}}double num = BinToDec(binSlice);Console.Write(num);}}/// <summary>/// 拼接三个二进制数据/// </summary>/// <returns>返回一个二十四位的二进制数据</returns> static int[] SpliceBin(int[] bin1, int[] bin2, int[] bin3){int[] bin = new int[24];for (int i = 0; i < 8; i++){bin[i] = bin1[i];}for (int i = 0; i < 8; i++){bin[i + 8] = bin2[i];}for (int i = 0; i < 8; i++){bin[i + 16] = bin3[i];}return bin;}/// <summary>/// 十进制转八位的二进制 以二进制倒序数组返回/// </summary>/// <param name="value"></param>/// <returns></returns>static int[] DecToBin(int value){int temp = value;int index = 0;int[] tempInt = new int[8];int[] result = new int[8];while (temp > 0){tempInt[index] = temp % 2;temp /= 2;index++;}for (int i = 0; i < 8; i++){result[i] = tempInt[7 - i];}return result;}/// <summary>/// 二进制转十进制/// </summary>/// <param name="value"></param>/// <returns></returns>static double BinToDec(int[] value){int num = 0;for (int i = 0; i < value.Length; i++){num += (int)(value[i] * Math.Pow(2, 23 - i));}return (float)num / 32768;}
【C#】UDP接收摄像头PTZ数据并解析相关推荐
- linux c语言 udp 接收和发送数据用同一个端口_网络编程基础入门及TCP,UDP
1.网络编程入门 1.1 网络编程概述 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享 ...
- 树莓派3b接收USB串口数据并解析处理
通过树莓派3b使用wiringPi接收串口数据,并对帧头帧尾进行判断,解析出符合帧协议的数据. 1. 帧头.帧尾.帧长度定义 我们在这里定义串口数据的帧头为 0x3A 0x3B,帧尾为 0x7E 0x ...
- linux c语言 udp 接收和发送数据用同一个端口_【Python学习笔记】80、UDP编程
TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包.但是,能不 ...
- linux udp接收不到数据,无法接收udp数据包
我不知道是网络配置的问题还是我的软件出了问题.在 我有一个地址为192.168.4.83的设备.这个设备直接连接到我的pc linux服务器,它的地址是192.168.4.11.在 我想用python ...
- python socket发送组播数据_python3通过udp实现组播数据的发送和接收操作
本文主要通过对海康摄像头进行抓包,模拟发送了udp包,并抓取摄像头返回的数据包,解析并提取相关信息. 通过抓包发现,海康摄像头发送.接收数据使用udp协议,后来比较发现,使用python模拟起来比较简 ...
- python获取本地时间并向服务器发送udp报文_python3通过udp实现组播数据的发送和接收操作...
本文主要通过对海康摄像头进行抓包,模拟发送了udp包,并抓取摄像头返回的数据包,解析并提取相关信息. 通过抓包发现,海康摄像头发送.接收数据使用udp协议,后来比较发现,使用python模拟起来比较简 ...
- netty udp接收超过2048字节数据
默认netty udp接收DatagramPacket字节数最大是2048,如果数据大,超过这个限制,就会报错,抛出异常,虽然这个包解析失败,不会影响其他包的解析,但是总得来说,这种失败是不利于数据收 ...
- 教你动手写UDP协议栈 - UDP数据包解析<1>
前景 为啥要自己写一个mini UDP的协议栈?因为我们干偷偷摸摸的事情,哈哈哈!!! 其实是为了不跑一个庞大的LWIP协议栈,通过自己写的mini udp协议栈截取数据包给设备升级.这样节省了很多资 ...
- 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )
文章目录 I UDP 信息发送接收原理 II UDP 发送和接收端口相同 III UDP 发送信息代码示例 IV UDP 接收信息代码示例 V UDP 服务器端代码示例 VI UDP 客户端代码示例 ...
最新文章
- cxgrid 保存数据_什么是大数据
- 破拆机器人_中国首台车载式遥控折叠装卸机器人横空出世
- struts-dojo的使用
- springboot ftp 笔记
- python人机猜拳游戏_Python实现剪刀石头布小游戏(与电脑对战)
- 网站维护页面_营销型企业网站有哪些功能?
- MySQL 面试,必须掌握的 8 个知识点
- Java项目集成永中文档在线预览
- 专题页汇聚seo流量的葵花宝典
- python爬取微博评论_python爬虫手把手教你抓取微博评论(完整代码)
- 各层电子数排布规则_按照核外电子排布规律:各电子层最多容纳电子数2n2(n为电子层数,...
- linux 笔记本sd卡,Linux如何使用笔记本自带的SD/MMC读卡器
- Content Provider(二)之 FileProvider 实现应用文件共享
- Python每日一练——第5天:闰年问题升级版
- Python解答多元线性方程组
- 可任意切换分频倍数的时钟分频电路
- Zxing 预览框不变增加扫描区域,仿微信扫到一半就可以成功
- 使用python爬虫爬取百度新闻,告诉你社会热点话题
- MEM/MBA 写作-论说文(03)立意 答案解析
- 什么是云原生的应用?
热门文章
- 快速打开Android离线文档
- SpringReport--使用luckysheet+echarts开发的在线报表和大屏设计系统
- 计算机网络根据所使用的传输技术,计算机网络的基本分类方法主要有两种:一种是根据网络所使用的传输技术;另一种是根据( )。...
- vue项目调用百度地图定位,判断当前位置是否在目标位置范围内
- Linux- 系统随你玩之--微服务应用出现极少概率会时断时续,它抽风了吗?
- 切身体会,debug与release的区别
- nodejs京东接口分析系列-实现京东自动化功能 之 扫码登陆,需要puppeteer
- 黑客瞄上火热人气 网上观影勿忘防毒
- JavaScript获取焦点并将光标移动到末尾字符
- 御神楽的学习记录之Springboot+netty实现Web聊天室