关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

news2024/10/6 0:28:12

目前只测试了与大华摄像机的语音对讲功能,在此记录下对接工程中遇到的问题和收获。

首先我们需要理清下思路:

第一步要熟悉语音对讲的协议流程,下图为国标28181中的参考图:

这里我们可以简化下流程,只参与与摄像机的信令交互,也就是1,2,3,4,5,14,15   17,18

这里我将信令详情展示出来,以供参考

1.发送语音广播请求

MESSAGE sip:34020000001320000001@192.168.1.108:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.20:9088;branch=4dae6d98892f4a0fb630b8e77d49bc30;rport
To: "" <sip:34020000001320000001@4401020048>
From: "34020000002000000002" <sip:34020000002000000002@192.168.1.20:9088>;tag=6606061
Call-ID: 6b135a147f4b425e981406bdd9751924@192.168.1.20
CSeq: 1 MESSAGE
Max-Forwards: 70
Content-Length: 193
Content-Type: Application/MANSCDP+xml

<?xml version="1.0" encoding="GB2312"?>
<Query>
<CmdType>Broadcast</CmdType>
<SN>991225</SN>
<SourceID>34020000002000000002</SourceID>
<TargetID>34020000001370000001</TargetID>
</Query>

2.设备回复OK
SIP/2.0 200 OK
Call-ID: 6b135a147f4b425e981406bdd9751924@192.168.1.20
Content-Length: 0
CSeq: 1 MESSAGE
From: "34020000002000000002"<sip:34020000002000000002@192.168.1.20:9088>;tag=6606061
To: ""<sip:34020000001320000001@4401020048>;tag=fcf251b2e36ab8324e6c7772c971ea06
User-Agent: SIP UAS V3.0.0.828177
Via: SIP/2.0/UDP 192.168.1.20:9088;rport=9088;branch=4dae6d98892f4a0fb630b8e77d49bc30

3.设备发送广播通知结果请求
MESSAGE sip:34020000002000000002@192.168.1.20:9088 SIP/2.0
Call-ID: 67c4f0acd67bb28284401481f6d66ba7
Content-Length: 187
Content-Type: Application/MANSCDP+xml
CSeq: 4997 MESSAGE
From: <sip:34020000001320000001@192.168.1.108:5060>;tag=8c22c278382c2ab79017a91f806b9ff0
Max-Forwards: 70
To: <sip:34020000002000000002@192.168.1.20:9088>
User-Agent: SIP UAS V3.0.0.828177
Via: SIP/2.0/UDP 192.168.1.108:5060;rport;branch=z9hG4bKa1bc3d6ca30b7e643b67aa393c7fb9f6

<?xml version="1.0" encoding="GB2312" ?>
<Response>
    <CmdType>Broadcast</CmdType>
    <SN>991225</SN>
    <DeviceID>34020000001370000001</DeviceID>
    <Result>OK</Result>
</Response>

4.回复设备OK

SIP/2.0 200 Ok
Via: SIP/2.0/UDP 192.168.1.108:5060;rport=5060;branch=z9hG4bKa1bc3d6ca30b7e643b67aa393c7fb9f6;received=192.168.1.108
To: <sip:34020000002000000002@192.168.1.20:9088>
From: <sip:34020000001320000001@192.168.1.108:5060>;tag=8c22c278382c2ab79017a91f806b9ff0
Call-ID: 67c4f0acd67bb28284401481f6d66ba7
CSeq: 4997 MESSAGE
Allow: ACK, BYE, CANCEL, INFO, INVITE, NOTIFY, OPTIONS, PRACK, REFER, REGISTER, SUBSCRIBE
Content-Length: 0

5.设备主动发起INVITE 请求

INVITE sip:34020000002000000002@192.168.1.20:9088 SIP/2.0
Call-ID: 24174d55333b5ba8c1b04ea8be4a755f
Contact: <sip:34020000001320000001@192.168.1.108:5060>
Content-Length: 240
Content-Type: application/sdp
CSeq: 1 INVITE
Expires: 120
From: <sip:34020000001320000001@192.168.1.108:5060>;tag=a2752e81ddc7ca8693c411f8b3c77329
Max-Forwards: 70
Subject: 34020000002000000002:03d7a8ef3276a8ef327,34020000001370000001:0552354c54f3354c54f
To: <sip:34020000002000000002@192.168.1.20:9088>
User-Agent: SIP UAS V3.0.0.828177
Via: SIP/2.0/UDP 192.168.1.108:5060;rport;branch=z9hG4bK17794d3a5b5e56a894332fd42136c92f

v=0
o=34020000001320000001 0 0 IN IP4 192.168.1.108
s=Play
i=VCam BroadCast Session
c=IN IP4 192.168.1.108
t=0 0
m=audio 9920 RTP/AVP 8 96
a=recvonly
a=rtpmap:8 PCMA/8000/1
a=rtpmap:96 PS/90000
y=0232409800
f=v/0/0/0/0/0a/1/8/1

14.回复给设备带SDP的OK确认消息
SIP/2.0 200 Ok
Via: SIP/2.0/UDP 192.168.1.108:5060;branch=z9hG4bK17794d3a5b5e56a894332fd42136c92f;rport
To: "" <sip:34020000002000000002@192.168.1.20:9088>;tag=24174d55333b5ba8c1b04ea8be4a755f
From: <sip:34020000001320000001@192.168.1.108:5060>;tag=a2752e81ddc7ca8693c411f8b3c77329
Call-ID: 24174d55333b5ba8c1b04ea8be4a755f
CSeq: 1 INVITE
Contact: "" <sip:34020000002000000002@192.168.1.20:9088>
Max-Forwards: 70
Content-Length: 169
Content-Type: APPLICATION/SDP

v=0
o=34020000002000000002 0 0 IN IP4 192.168.1.20
s=Play
c=IN IP4 192.168.1.20
t=0 0
m=audio 30050 RTP/AVP 8
a=sendonly
a=rtpmap:8 PCMA/8000/1
y=0232409800

15.设备回复ACK确认消息
ACK sip:34020000002000000002@192.168.1.20:9088 SIP/2.0
Call-ID: 24174d55333b5ba8c1b04ea8be4a755f
Contact: <sip:34020000001320000001@192.168.1.108:5060>
Content-Length: 0
CSeq: 1 ACK
From: <sip:34020000001320000001@192.168.1.108:5060>;tag=a2752e81ddc7ca8693c411f8b3c77329
Max-Forwards: 70
To: <sip:34020000002000000002@192.168.1.20:9088>;tag=24174d55333b5ba8c1b04ea8be4a755f
User-Agent: SIP UAS V3.0.0.828177
Via: SIP/2.0/UDP 192.168.1.108:5060;rport;branch=z9hG4bK0571dff2cc66262a140a3a66925ca316

在这个过程中,我们可以得到以下信息:

        1.设备支持8000采样率,单通道的PCMA流和90000 PS包

        2.设备提供的收留端口为9920

        3.我们发送流的端口为30050

        4.我们需要发送的音频流为PCMA 8000采样率的RTP包

这里还有几点需要注意:

        1.经过测试,语音对讲请求与设备的通道ID中是否标记为137无关,在信令1中TargetID字段的标红部分

 2.发起语音广播请求1中,TargetID可以为设备ID,也可以为设备的通道ID,

3.设备发送的INVITE后,回复带SDP的OK响应时(信令14),to字段中tag不能为空,可以指定为call-id,否则无法收到ACK确认消息

4.回复带SDP的OK响应时(信令14),sdp协议中不要包含多余信息。如

m=audio 30050 RTP/AVP 8 96
a=sendonly
a=rtpmap:8 PCMA/8000/1

这里我们并没有使用96 PS流,如果这样发送过去,会导致设备确认后,立马发送BYE消息

所以,不必要的信息,最好不带,以免参数异常问题

至此,我们与摄像机建立了语音对讲的连接。接下来我们只需要使用协商好的端口往摄像机指定的端口发送数据流即可。

接下来,我们需要发送PCMA 8000的RTP包,这里需要用到VLC,ffmpeg,ffprobe,ffplay等工具,这些工具可以帮助我们测试。

首先,如何构建出一个PCMA 8000 单通道的问题,使用FFMPEG命令:

ffmpeg -i D:\CloudMusic\外婆.mp3 -map_metadata -1 -fflags +bitexact -acodec pcm_alaw -ac 1 -ar 8000 外婆_PCMA.wav -y

参数详解: -acode pcm_alaw  编码为pcma格式

                 -ac 1 单声道

                 -ar 8000是采样率8000   

                 -map_metadata -1 -fflags +bitexact 是将ffmpeg转码默认携带的LIST的数据(artist,genre等)去掉,变成标准的44字节的wav文件头

这里使用fprobe工具查看我们转码的文件是不是我们想要的

ffprobe C:\Users\24610\外婆_PCMA.wav

 这里,我们看到的确是我们想要的文件,那么如何打包成RTP流发送出去呢?

我们打开VLC,

 

 

 

 

 

 

这里我们已经开始发送RTP流了,我们可以使用ffplay播放,

ffplay -i rtp://192.168.1.20:5004 

或者再启动一个VLC,打开网络串流输入:rtp://192.168.1.20:5004 都是可以的,这里我们可以拿来测试RTP包是否发送正常,这里还不能往摄像机发送,因为这里发送端口是随机的,我们需要使用特定端口(这里是30050)来发送,这就要在代码中实现的。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络第二章知识点回顾(自顶向下)

第二章知识点回顾1.应用层1.1网络应用架构1.1.1客户-服务器架构1.1.2P2P架构1.1.3两种架构的对比1.2不同终端上的进程通信1.3进程与网络的接口&#xff1a;套接字1.4进程如何标识自己&#xff1a;进程编址1.5因特网提供的传输服务小结1.6Web应用画像1.7 HTTP协议1.7.1HTTP使用T…

大数据技术基础实验十三:Kafka实验——订阅推送示例

大数据技术基础实验十三&#xff1a;Kafka实验——订阅推送示例 文章目录大数据技术基础实验十三&#xff1a;Kafka实验——订阅推送示例一、前言二、实验目的三、实验要求四、实验原理1、Kafka简介2、Kafka使用场景五、实验步骤1、配置各服务器之间的免密登录2、安装ZooKeeper…

【C++】优先级队列 priority_queue的使用模拟实现 | 仿函数

&#x1f308;欢迎来到C专栏~~优先级队列的使用 & 模拟实现 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01…

聚乙二醇衍生物MAL-PEG-NH2,Maleimide-PEG-amine,CAS:1207751-12-9​

英文&#xff1a;MAL-PEG-NH2&#xff0c;Maleimide-PEG-amine 中文&#xff1a;马来酰亚胺-聚乙二醇-氨基 2、CAS编号&#xff1a;1207751-12-9 3、所属分类&#xff1a;Amine PEG Maleimide PEG 4、分子量&#xff1a;可定制&#xff0c;5000、2000、3400、20000、10000、…

【附源码】Python计算机毕业设计汽车租赁网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

eBPF学习笔记(一)—— eBPF介绍内核编译

eBPF学习笔记&#xff08;一&#xff09;—— eBPF介绍&内核编译eBPF介绍eBPF基础代码验证即时编译eBPF开发工具BCCbpftracelibbpf C/C库eBPF Go库内核编译查看内核版本下载内核源码安装依赖项安装最新版llvm和clang配置内核编译内核BPF示例程序常见问题问题一&#xff1a;…

C++ 堆、大顶堆、小顶堆、堆排序

目录一、什么是堆&#xff1f;1.1 大顶堆1.2 小顶堆1.3 自定义greater1.4 堆索引的特点1.5 堆操作添加元素删除最大元素检查序列是否是堆检查部分序列为堆对堆进行排序升序降序问题&#xff1a;sort()和sort_heap()有什么区别二、排序算法&#xff1a;堆排序2.1 堆排序原理创建…

Bootstrap框架(全)

Bootstrap中文网&#xff1a;点我直达 Bootstrap菜鸟教程&#xff1a;点我直达 目录&#xff1a;&#xff08;一&#xff09;Bootstrap标准模板&#xff1a;&#xff08;二&#xff09;CSS样式区&#xff1a;一、布局容器&#xff1a;二、栅格系统&#xff1a;1.列组合&#x…

<Linux> 软件包管理器yum及编辑器vim的使用

文章目录一、yum的背景知识1. 商业生态2. 开源生态3. 软件生态本土化二、yum 的基本使用1. 查看软件包2. 安装、卸载、搜索软件实现Windows下和Linux下文件互传三、vim的基本使用1. vim 的基本概念2. vim 的基本操作2.1.模式间切换2.2.插入模式2.3.命令模式2.4.底行模式四、vim…

nginx(四十二)access阶段的模块学习

一 ngx_http_access ① 基本描述 场景&#xff1a; 限制某些ip来源的访问;基于ip进行限制细节点&#xff1a; 基于$remote_addr进行判断的 ② allow deny ③ 官方案例 说明&#xff1a; 按照配置文件中allow|deny的先后顺序,只要匹配上则停止继续匹配 ④ 经典应用场…

Rust机器学习之ndarray

Rust机器学习之ndarray 众所周知&#xff0c;Python之所以能成为机器学习的首选语言&#xff0c;与其丰富易用的库有很大关系。某种程度上可以说是诸如numpy、pandas、scikit-learn、matplotlib、pytorch、networks…等一系列科学计算和机器学习库成就了Python今天编程语言霸主…

Vue项目实战——【基于 Vue3.x + NodeJS】实现的课程表排课系统二(week-title)

文章目录基于 Vue3.x NodeJS实现的课程表排课系统&#xff08;二&#xff09;初始化样式封装axios处理数据表格头部&#xff08;周几&#xff09;子组件写入根组件App.vue浅拿一下数据基于 Vue3.x NodeJS实现的课程表排课系统&#xff08;二&#xff09; 初始化样式 src/ass…

当 AI 遇上 web3,会碰撞出什么火花?

2020 年之前&#xff0c;Web3 的路是创造者们铺好的。但 Web3 遇上了金融&#xff0c;这出乎了每个创造者的意料之外&#xff0c;稳定币、AMM 和借贷突其来地点燃了2020年的那个夏天。之后 Web3 又遇到了 NFT、游戏和元宇宙。不过因为技术限制&#xff0c;除了金融之外&#xf…

AVL树详解(附带旋转步骤图,手把手带你上分)

文章目录&#x1f44d; AVL树的概念先了解一下&#x1f601;AVL树节点的定义&#x1f60a;AVL树插入节点&#x1f91e;AVL树为什么要旋转&#x1f60d;AVL树的四种旋转左单旋右单旋左右双旋右左双旋❤️结语关于AVL树的讲解 &#x1f44d; AVL树的概念先了解一下 它的左右子树…

Scala005--Scala中的数据结构【集合】之数组

Scala中的数据结构和Java中一样&#xff0c;都有数组&#xff0c;列表&#xff0c;集合&#xff0c;映射。在Scala中与Java不同的是数组可以有可变数组&#xff0c;而不是一旦定义就不可以进行更改。我们来认识数组&#xff0c;并使用相应的代码去查看具体的实现效果。 目录 …

Linux命令从入门到实战 ----进程管理

文章目录kill终止进程pstree查看进程树netstat网络状态和端口占用信息crontab定时任务进程(process): 是正在执行的一个程序或命令&#xff0c;每一个进程都是一个运行的实体&#xff0c;都有自己的地址空间&#xff0c;并占用一定的系统资源 服务(service)&#xff1a;启动之后…

深度学习 Day 18——利用卷神经网络实现猫狗识别 Ⅱ

深度学习 Day 18——利用卷神经网络实现猫狗识别 Ⅱ 文章目录深度学习 Day 18——利用卷神经网络实现猫狗识别 Ⅱ一、前言二、我的环境三、前期工作1、导入依赖项并设置GPU2、导入数据四、数据预处理1、加载数据2、检查数据3、配置数据集并进行归一化处理4、可视化数据五、构建…

xv6源码解析(三)——内存管理

01 内存管理 内存管理&#xff1a;通过编写物理页分配器&#xff0c;以链表管理所有空闲页帧&#xff0c; 实现了对物理页帧的回收与分配&#xff1b;在xv6系统sbrk内存管理方式的基础上&#xff0c;添加了进程用户空间非连续分区的分配。 内存管理参考链接 mmap 02 sbrk机制…

猿创征文|【Linux】Linux中的gdb调试器的使用

目录 一、什么是gdb&#xff1f; 二、gdb的安装 三、gdb的使用 1、只有debug版可以被调试 2、gdb的常用指令 2.1显示代码&#xff1a;l指令&#xff08;list指令&#xff09; 2.2设置断点&#xff1a;b指令&#xff08;break指令&#xff09; 2.3显示断点/禁用断点/开启…

Linux操作系统~进程fork到wait到底怎么用?

目录 1.fork() &#xff08;1&#xff09;.概念 &#xff08;2&#xff09;.fork的写时拷贝 &#xff08;3&#xff09;.fork常规用法 2.进程终止 &#xff08;1&#xff09;.进程退出场景/退出码 &#xff08;2&#xff09;.进程常见退出方法 1&#xff09;.exit函数 …