当前位置: 首页 > news >正文

GB28181学习(十四)——语音广播与语音对讲

语音对讲

定义

在这里插入图片描述

  • 用户端向设备通过视音频点播请求音频数据;
  • 用户端接收音频数据并通过特定的播放设备(如音响)播放;
  • 用户端向设备发送广播请求;
  • 设备解析广播成功后通过INVITE方法向用户请求音频数据;
  • 用户通过音频采集设备获取音频数据;
  • 用户将采集的音频数据发送至设备;

可以总结为:音频数据的双向传输。

抓包

  1. 发送INVITE请求( mysipsdk—>设备)
INVITE sip:xxx@192.168.0.111:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.107:5060;rport;branch=xxx
Max-Forwards: 70
From: sip:xxx@192.168.0.107;tag=xxx
To: sip:xxx@192.168.0.111
Contact: <sip:xxx@192.168.0.107:5060>
Call-ID: xxx
CSeq: 18467 INVITE
Allow: SUBSCRIBE, NOTIFY, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: 
Subject: xxx:xx,xxx:xx
Content-Type: application/sdp
Content-Length:   169v=0
o=xxx 0 0 IN IP4 192.168.0.107
<!--请求媒体流的操作类型:Talk-->
s=Talk
c=IN IP4 192.168.0.107
t=0 0
<!--媒体类型:音频(audio) 传输端口:38000 传输方式:UDP 负载类型:8(PCMA)-->
m=audio 38000 RTP/AVP 8
a=sendrecv
<!--负载类型:8(PCMA) 时钟频率:8000-->
a=rtpmap:8 PCMA/8000
<!--"f=v/编码格式/分辨率/帧率/码率/码率大小a/编码格式/码率大小/采样率"-->
f=v/a/1/8/1
y=0100000001
  1. 接收设备响应(设备—>mysipsdk)
SIP/2.0 200 OK
Call-ID: xxx
Contact: <sip:xxx@192.168.0.111:5060>
Content-Length: 270
Content-Type: application/sdp
CSeq: 18467 INVITE
From: <sip:xxx@192.168.0.107>;tag=xxx
To: <sip:xxx@192.168.0.111>;tag=xxx
User-Agent: SIP UAS V.2016.xxxx
Via: SIP/2.0/UDP 192.168.0.107:5060;rport=5060;branch=xxxv=0
o=xxx 0 0 IN IP4 192.168.0.111
s=Talk
i=VCam Talk Session
c=IN IP4 192.168.0.111
t=0 0
m=audio 9712 RTP/AVP 8
a=recvonly
a=rtpmap:8 PCMA/8000/1
m=audio 9712 RTP/AVP 8
a=sendonly
a=rtpmap:8 PCMA/8000/1
y=0100000001
f=v/0/0/0/0/0a/0/0/0
  1. 发送ACK到设备(mysipsdk—>设备)
ACK sip:xxx@192.168.0.111:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.107:5060;rport;branch=xxx
Max-Forwards: 70
From: sip:xxx@192.168.0.107;tag=xxx
To: sip:xxx@192.168.0.111;tag=xxx
Call-ID: xxx
CSeq: 18467 ACK
Content-Length:  0
  1. 接收音频数据(设备—>mysipsdk)

在这里插入图片描述

代码

  • 组装sdp
static std::string CreateSDPForAudio(const GB28181MediaContext& mediaContext)
{char str[500] = { 0 };pj_ansi_snprintf(str, 500,"v=0\n""o=%s 0 0 IN IP4 %s\n""s=Talk\n""c=IN IP4 %s\n""t=0 0\n""m=audio %d RTP/AVP 8\n""a=sendrecv\n""a=rtpmap:8 PCMA/8000\n""f=v/a/1/8/1\n""y=0100000001\n",mediaContext.GetDeviceId().c_str(),mediaContext.GetRecvAddress().c_str(),mediaContext.GetRecvAddress().c_str(),mediaContext.GetRecvPort());return str;
}
  • 音频数据接收与视频数据接收类似,根据sdp协商确定接收的音频格式;

语音广播

要求

在这里插入图片描述

流程

在这里插入图片描述

抓包

  1. 发送广播通知(mysipsdk—>设备)
MESSAGE sip:xxx@192.168.0.111:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.107:5060;rport;branch=xxx
Max-Forwards: 70
From: <sip:xxx@192.168.0.107>;tag=xxx
To: <sip:xxx@xx>
Contact: <sip:xxx@192.168.0.107:5060>
Call-ID: xxx
CSeq: 18467 MESSAGE
Content-Type: Application/MANSCDP+xml
Content-Length:   186<?xml version="1.0" encoding="UTF-8"?>
<Notify>
<CmdType>Broadcast</CmdType>
<SN>130</SN>
<!--语音输入设备的设备编码-->
<SourceID>xxx</SourceID>
<!--语音输出设备的设备编码-->
<TargetID>xxx</TargetID>
</Notify>
  1. 广播通知响应(设备—>mysipsdk)
SIP/2.0 200 OK
Call-ID: xxx
Content-Length: 0
CSeq: 18467 MESSAGE
From: <sip:xxx@192.168.0.107>;tag=xxx
To: <sip:xxx@xxx>;tag=xxx
User-Agent: SIP UAS V.2016.xxxx
Via: SIP/2.0/UDP 192.168.0.107:5060;rport=5060;branch=xxx
  1. 广播通知结果(设备—>mysipsdk)
MESSAGE sip:xxx@192.168.0.107 SIP/2.0
Call-ID: xxx
Content-Length: 180
Content-Type: Application/MANSCDP+xml
CSeq: 2 MESSAGE
From: <sip:xxx@192.168.0.111:5060>;tag=xxx
Max-Forwards: 70
To: <sip:xxx@192.168.0.107>
User-Agent: SIP UAS V.2016.xxxx
Via: SIP/2.0/UDP 192.168.0.111:5060;rport;branch=xxx<?xml version="1.0" encoding="GB2312" standalone="yes" ?>
<Response>
<CmdType>Broadcast</CmdType>
<SN>130</SN>
<DeviceID>xxx</DeviceID>
<Result>OK</Result>
</Response>
  1. 广播通知结果响应(mysipsdk—>设备)
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.111:5060;rport=5060;received=192.168.0.111;branch=xxx
Call-ID: xxx
From: <sip:xxx@192.168.0.111>;tag=xxx
To: <sip:xxx@192.168.0.107>;tag=xxx
CSeq: 2 MESSAGE
Content-Length:  0
  1. 广播请求(设备—>mysipsdk)
INVITE sip:xxx@192.168.0.107:5060 SIP/2.0
Call-ID: xxx
Contact: <sip:xxx@192.168.0.111:5060>
Content-Length: 240
Content-Type: application/sdp
CSeq: 1 INVITE
Expires: 120
From: <sip:xxx@192.168.0.111:5060>;tag=xxx
Max-Forwards: 70
Subject: xxx:xxx,xxx:xxx
To: <sip:xxx@192.168.0.107:5060>
User-Agent: SIP UAS V.2016.xxxx
Via: SIP/2.0/UDP 192.168.0.111:5060;rport;branch=xxxv=0
o=xxx 0 0 IN IP4 192.168.0.111
s=Play
i=VCam BroadCast Session
c=IN IP4 192.168.0.111
t=0 0
m=audio 9712 RTP/AVP 8 96
a=recvonly
a=rtpmap:8 PCMA/8000/1
a=rtpmap:96 PS/90000
y=0022371912
f=v/0/0/0/0/0a/1/8/1
  1. 广播请求响应(mysipsdk—>设备)
SIP/2.0 200 OK
From: <sip:xxx@192.168.0.107:5060>;tag=xxx
To: <sip:xxx@192.168.0.111:5060>;tag=xxx
Call-ID: xxx
CSeq: 1 INVITE
User-Agent: General SIP UAS V1.0
Via: SIP/2.0/UDP 192.168.0.111:5060;rport;branch=xxx
Contact: <sip:xxx@192.168.0.107:5060>
Content-Type: application/SDP
Content-Length: 182v=0
o=xxx 0 0 IN IP4 192.168.0.107
s=Play
c=IN IP4 192.168.0.107
t=0 0
m=audio 40000 RTP/AVP 8
a=rtpmap:8 PCMA/8000
a=sendonly
y=0022371912
  1. 广播请求响应ACK(设备—>mysipsdk)
ACK sip:xxx@192.168.0.107:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.111:5060;rport;branch=xxx
From: <sip:xxx@192.168.0.111:5060>;tag=xxx
To: <sip:xxx@192.168.0.107:5060>;tag=xxx
Call-ID: xxx
CSeq: 1 ACK
Contact: <sip:xxx@192.168.0.111:5060>
Max-Forwards: 70
User-Agent: IP Camera
Content-Length: 0
  1. 关闭广播(设备—>mysipsdk)
BYE sip:xxx@xxx SIP/2.0
From: <sip:xxx@xxx>;tag=xxx
To: <sip:xxx@xxx>;tag=xxx
CSeq: 2 BYE
Call-ID: xxx
Via: SIP/2.0/UDP 192.168.0.111:5060;branch=xxx
Max-Forwards: 70
Content-Length: 0
  1. 关闭广播响应(mysipsdk—>设备)

相关文章:

GB28181学习(十四)——语音广播与语音对讲

语音对讲 定义 用户端向设备通过视音频点播请求音频数据&#xff1b;用户端接收音频数据并通过特定的播放设备&#xff08;如音响&#xff09;播放&#xff1b;用户端向设备发送广播请求&#xff1b;设备解析广播成功后通过INVITE方法向用户请求音频数据&#xff1b;用户通过音…...

Java实验一编程环境使用

1&#xff0e;String类的常用方法&#xff08;StringExample.java&#xff09; package step1;public class StringExample {public static void main(String args[]) {String s1 new String("you are a student");String s2 new String("how are you")…...

【数据结构】——线性表简答题模板

目录 一、顺序表二、链表三、顺序表与链表的对比四、循环链表五、静态链表 一、顺序表 【顺序表是什么/数组与顺序表的区别】 1、数组和顺序表的区别在哪里&#xff1f; 答&#xff1a;顺序表体现了数据元素之间的线性关系&#xff0c;即一对一的关系&#xff0c;以及对数据元…...

lambda和stream

理解 lambda 表达式和 Stream 是 Java 高级工程师的关键技能之一&#xff0c;它们为 Java 开发提供了更强大、更精简和更高效的编程工具。本篇 CSDN 文章将帮助你以高级工程师的角度深入掌握这两个概念&#xff0c;以便在实际项目中发挥你的 Java 技能。 ## 什么是 Lambda 表达…...

go微信开发sdk-简单使用_已设置图床

go微信开发sdk-简单使用 GitHub - silenceper/wechat: WeChat SDK for Go &#xff08;微信SDK&#xff1a;简单、易用&#xff09; 使用的sdk为上述的&#xff0c;这边给出快速的项目实例 git clone https://github.com/gowechat/example.git简单的项目结构 这边简单用dock…...

Java判断文本是否有敏感词

文章目录 Java判断文本是否有敏感词实现方法一、总体流程二、实现步骤1、构建敏感词库2、加载敏感词库3、文本分词4、敏感词匹配 Java判断文本是否有敏感词实现方法 一、总体流程 在Java中判断文本是否包含敏感词可以通过构建敏感词库并进行匹配来实现。下面是整个流程的表格…...

【腾讯云 HAI域探秘】基于ChatGLM和StableDiffusion的小学一年级语文教学方案创作实践与经验分享

前言 目前腾讯云HAI正在内测中&#xff0c;腾讯云HAI为开发者量身打造的澎湃算力平台。无需复杂配置&#xff0c;便可享受即开即用的GPU云服务体验。在 HAI 中&#xff0c;根据应用智能匹配并推选出最适合的GPU算力资源&#xff0c;以确保您在数据科学、LLM、AI作画等高性能应用…...

flink状态不能跨算子

背景 在flink中进行状态的维护和管理应该是我们经常做的事情&#xff0c;但是有些同学认为名称一样的状态在不同算子之间的状态是同一个&#xff0c;事实是这样吗&#xff1f; flink状态在保存点中的存放示意图 事实上&#xff0c;每个状态都归属于对应的算子&#xff0c;也…...

基于transformer的解码decode目标检测框架(修改DETR源码)

提示:transformer结构的目标检测解码器,包含loss计算,附有源码 文章目录 前言一、main函数代码解读1、整体结构认识2、main函数代码解读3、源码链接二、decode模块代码解读1、decoded的TransformerDec模块代码解读2、decoded的TransformerDecoder模块代码解读3、decoded的De…...

Java SE 学习笔记(十七)—— 单元测试、反射

目录 1 单元测试1.1 单元测试概述1.2 单元测试快速入门1.3 JUnit 常用注解 2 反射2.1 反射概述2.2 获取类对象2.3 获取构造器对象2.4 获取成员变量对象2.5 获取常用方法对象2.6 反射的作用2.6.1 绕过编译阶段为集合添加数据2.6.2 通用框架的底层原理 1 单元测试 1.1 单元测试概…...

HNU-计算机网络-实验1-应用协议与数据包分析实验(Wireshark)

计算机网络 课程基础实验一 应用协议与数据包分析实验(Wireshark) 计科210X 甘晴void 202108010XXX 一、实验目的&#xff1a; 通过本实验&#xff0c;熟练掌握Wireshark的操作和使用&#xff0c;学习对HTTP协议进行分析。 二、实验内容 2.1 HTTP 协议简介 HTTP 是超文本…...

【深度学习】快速制作图像标签数据集以及训练

快速制作图像标签数据集以及训练 制作DataSet 先从网络收集十张图片 每种十张 定义dataSet和dataloader import glob import torch from torch.utils import data from PIL import Image import numpy as np from torchvision import transforms import matplotlib.pyplot…...

Spring Boot Web MVC

文章目录 一、Spring Boot Web MVC 概念二、状态码三、其他注解四、响应操作 一、Spring Boot Web MVC 概念 Spring Web MVC 是⼀个 Web 框架&#xff0c;一开始就包含在Spring 框架里。 1. MVC 定义 软件⼯程中的⼀种软件架构设计模式&#xff0c;它把软件系统分为模型、视…...

设置防火墙

1.RHEL7中的防火墙类型 防火墙只能同时使用一张,firewall底层调用的还是lptables的服务: firewalld:默认 &#xff0c;基于不同的区域做规则 iptables: RHEL6使用&#xff0c;基于链表 Ip6tables Ebtables 2.防火墙的配置方式 查看防火墙状态: rootlinuxidc -]#systemct…...

3.Docker的客户端指令学习与实战

1.Docker的命令 1.1 启动Docker&#xff08;systemctl start docker&#xff09; systemctl start docker1.2 查看docker的版本信息&#xff08;docker version&#xff09; docker version1.3 显示docker系统范围的信息&#xff08;docker info&#xff09; docker info1.4…...

【微服务开篇-RestTemplate服务调用、Eureka注册中心、Nacos注册中心】

本篇用到的资料&#xff1a;https://gitee.com/Allengan/cloud-demo.githttps://gitee.com/Allengan/cloud-demo.git 目录 1.认识微服务 1.1.单体架构 1.2.分布式架构 1.3.微服务 1.4.SpringCloud 1.5.总结 2.服务拆分和远程调用 2.1.服务拆分原则 2.2.服务拆分示例 …...

python if和while的区别有哪些

python if和while的区别有哪些&#xff1f;下面给大家具体介绍&#xff1a; 1、用法 while和if本身就用法不同&#xff0c;一个是循环语句&#xff0c;一个是判断语句。 2、运行模式 if 只做判断&#xff0c;判断一次之后&#xff0c;便不会再回来了。 while 的话&#xf…...

Unity计时器

using UnityEngine; using System.Collections;public class Timer : MonoBehaviour {public float duration 1.0f; // 定时器持续时间public bool isLooping false; // 是否循环public bool isPaused false; // 是否暂停计时器private float currentDuration 0.0f; // 当前…...

Unity热更新介绍

打包函数 BuildPipeline.BuildAssetBundles("AssetBundles", BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.Android);打包策略和方案 按文件夹打包&#xff1a;Bundle数量少&#xff0c;首次下载块&#xff0c;但是后期更新补丁大按文件打包&#…...

在虚拟机centos7中部署docker+jenkins最新稳定版

在虚拟机centos7中部署dockerjenkins最新稳定版 查看端口是否被占用 lsof -i:80 查看运行中容器 docker ps 查看所有容器 docker ps -a 删除容器 docker rm 镜像/容器名称 强制删除 docker rmi -f 镜像名 查看当前目录 pwd 查看当前目录下所有文件名称 ls 赋予权限 chown 777 …...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...