【蓝牙协议栈】【BR/EDR】【AVDTP】音视频分布传输协议

news2024/9/23 9:31:46

1. AVDTP概念

        AVDTP即 AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL(音视频分配传输协议),主要负责 A/V stream的协商、建立及传输程序,还指定了设备之前传输A/V stream的消息格式.

        AVDTP的传输机制和消息格式是以 RTP为基础的。RTP由 RTP Data Transfer Protocol (RTP)和 RTP Control Protocol(RTCP)组成。AVDTP是在 L2CAP上传输的。AVDTP有专门的 PSM(0x19)值。

AVDTP和蓝牙协议栈的结构图:

        A/V stream和 A/V signaling都在 L2CAP上传输。Signaling负责 stream的发现、配置、建立和传输控制。

        我们来扩展下整个协议栈的架构,用一个更全面的图示来说明下:

        可以看到上图架构红框内就是 AVDTP协议,AVDTP的底层是 L2CAP层。 AVDTP一共有以下几个组件

① Signalling

        命令以及命令响应交互通道

② Stream Manager

        流管理组件,一共有以下几种能力:传输流,组合 media封包,时间戳管理,media封包序号管理,报告丢包给上层,抖动计算

③ Recovery

        封包回复组件

④ Adaptation Layer

        这层提供了一下几个能力:多路复用模式,允许在一个传输通道(TCID)上多路复用多个传输会话(TSID),使用更强劲头压缩

        另外,以上图示需要功能如图片

传输服务

AVDTP一共分为几个传输服务

1)Basic Service

2)Recovery Service

3)Reporting Service

4)Adaptation Service – Multiplexing

5)Adaptation Service – Robust Header Compression

6)Transport and Signaling Channel Establishment

下面我们来针对每个服务详细讲解下

1)Basic Service

基本服务,当基本服务开启的时候只有两个组件可用(Signalling ,Stream Manager),如图

        AVDTP基本服务确保通过单个传输通道传输每个会话的媒体包。该服务提供了适当的接口,使应用程序能够流进/流出满足传输通道的最大大小要求的包单元。当通道成功配置后,此包大小限制将返回给应用程序。

2)Recovery Service

        

        在 basic service的基础上加了 Recovery组件

        该恢复服务使用 SRC端上的一个传输会话的媒体包来生成附加的编码包;这些恢复包可以在 SNK端用于重建在空气传输路径上丢失的原始媒体包。

        这种服务特别适用于需要巨大带宽和重传能力有限的应用程序。与基带 FEC相比,恢复服务实现了一种灵活的随需应变的错误纠正机制:应用程序根据信道条件完全控制服务操作,并可以决定只覆盖媒体流中最敏感的部分。该服务独立于基带包类型执行,可为每个活动传输会话选择。        

         为了有效地对抗干扰,所有恢复包都通过一个单独的传输通道传送。

3)Reporting Service

 

用到以上组件

        打开时,报告服务向本地用户提供统计信息应用程序和到远程设备的媒体流的时间对齐包损失。这些报告用于实现适当的媒体流同步和/或调整应用程序的错误隐藏策略。

        报告服务可以配置为单向(从 SNK到 SRC或从 SRC到 SNK),也可以配置为双向,这取决于应用程序的需求。服务接口允许应用程序调整报告的周期和激活/停用服务根据上下文。

        报告服务可以使用独立的传输通道传输报表数据包到远程端。

4)Adaptation Service – Multiplexing

 

 

        在多路复用模式中,属于同一种或属于某一种的多个传输会话不同的流,可以共享一个公共传输(L2CAP)通道。此外,一个 L2CAP数据包可以包含属于相同或不同传输的多个数据包会话。因此,每个封装头都需要媒体/报告/恢复包。包含在这个头中的 TSID允许正确 SNK设备上数据包的路由。

        在流配置过程中,INT分配了 tsid和 tcid并通知 ACP。避免在多设备配置中发生冲突为了减小其宽度,将 TSID和 TCID的范围限制在连接上在一对设备之间。建立流程不一定打开一个新的传输(L2CAP)通道。相反,它可以将一个新的传输会话映射到现有的 L2CAP信道。这是通过引用一个现有的 TCID来实现的。

5)Adaptation Service – Robust Header Compression

        健壮的报头压缩是一种传输服务,它可以减少这方面的开销媒体包和恢复包的头引入。这种机制是完全可由应用程序选择,但在两个设置相同的配置要建立的每个流的连接的两端。健壮的头压缩机制允许使用一个反馈通道,这是在谈判媒体流配置的时间。

6)Transport and Signaling Channel Establishment

        参与 stream connection的两个设备之间最多需要 4个 L2CAP通道。建立顺序(数字决定优先级)如下图所示:

2. AVDTP术语介绍

Stream:两个点对点设备之间的流媒体数据

Source (SRC) and Sink (SNK):SRC是音视频的发送方,SNK是音视频的接收方。

Initiator (INT) and Acceptor (ACP):启动过程的设备作为启动者、接受启动的设备为接收者。要注意的是 INT和 ACP独立于上层应用定义的 SRC和 SNK,也就是在一个 CMD跟 RESPONSE中,发送 CMD的是 INT角色,回送 RESPONSE的就是 ACP角色,所以他的角色会一直在动态切换中,我个人觉得这个定义有点奇怪并且鸡肋

Application and Transport Service Capabilities:应用服务和传输服务的功能。应用服务功能比如协商、配置音源设备的 codec,内容保护系统等;传输服务能力比如数据报文的分割和重组,数据包的防丢检测等等。

Services, Service Categories, and Service Parameters:AVDTP的特性集合。ACP会向 INT暴露它的 capabilities,INT启动程序问询 ACP的 capabilities,并选择一些想用的 capabilities进行配置。Application Service Capabilities表示应用层提供的 services,包括:协商和配置 source codecs、内容保护系统、媒体同步等。Transport Service Capabilities更具体的描述 services,包括分帧和分段、封装、传输性能报告、包丢失检测、包恢复、稳健的 header压缩、传输会话到传输通道的多路复用等

Media Packets, Recovery Packets, and Reporting Packets:Media Packets用来封装流媒体数据(可以理解为RTP包),方向是从SRC到SNK。Recovery packets包含恢复数据,由SRC发送给SNK(packet recovery使用时才会有)。Reporting Packets包含QoS reporting数据(当QoS reporting使用时,可以理解为RTCP包),双向的。

Stream End Point (SEP):流端点,流端点是为了协商一个流而公开可用传输服务和 A/V功能的应用程序

Stream Context (SC):流上下文。指在流设置过程中,两个对等设备达到一个公共的了解流的配置,包括选择的服务,参数,以及传输通道分配。

Stream Handle (SH):流句柄。在 SRC和 SNK建立了连接之后分配的一个独立的标识符,代表了上层对流的引用

Stream End Point Identifier (SEID):流端点标识,对特定设备的跨设备引用,该引用用于信令事物

Stream End Point State:流端点状态

Transport Session:传输会话。在 A/V传输层的内部,在配对的 AVDTP实体之间,流可以分解为一个、两个或多个三个传输会话。

Transport Session Identifier (TSID):传输会话标识。代表对一个传输会话的引用。

Transport Channel:传输通道。传输通道指的是对 A/V传输层下层承载程序的抽象,始终对应 L2CAP的通道

Transport Channel Identifier (TCID):传输通道标识。代表对一个传输通道的引用。

Reserved for Future Additions(RFA):保留给将来添加

Reserved for Future Definitions (RFD):保留给将来定义

Forbidden (F):弃用

17.3 AVDTP封包格式

17.3.1 AVDTP Signal封包格式

以上就是 Signal的 header format,可以看到分 3种封包格式:

1)单一封包

2)开始封包,一般用于封包大小>MTU的拆包的第一个封包

3)继续封包和结束封包,一般用于封包大小>MTU的继续封包和结束封包

下面我们来讲下参数:

Transaction Label:传输标示,4bit,INT角色来填写一个值,ACP必须回送一样的值

Packet Type:封包类型,有以下几种

 

 Message Type:消息类型,有以下几种

Signal Identifier:信令标识符,有以下几种值

NOSP = Number Of Signal Packets:Start封包会告知后续有多少个封包要传输

17.3.2 AVDTP Media封包格式 AVDTP音视频格式如下:

其中有 12byte是强制的一定要存在的,也就是上图浅灰色,也有可选存在的,也就是上图深灰色,下面我们来看下各个的 field的概念

 

Version:RTP版本,一般值是 2,还有两个值但是一般不用,

值为 1就是 RTP的草案版本值为 0是在最开始的”vat”音频工具中使用

Padding:在包末尾填充 1个或者多个 byte表示填充,这部分忽略

Extension:扩展位,此位如果是 1,那么在固定头部后面加一个 byte扩展位 CSRC count:标示后面的 CSRC有多少 Byte

Marker (M):marke是由一个 profile定义 的。用来 允许 标识在 像报文流 中界定 帧界 等

的 事件。一个 profile 可能定义了附加 的标识位或者通过修改 payload type域中的位数量来指定没有标识位。

Payload Type (PT):有效荷载类型,占 7位,用于说明 RTP报文中有效载荷的类型,如 GSM音频、JPEM图像等,在流媒体中大部分是用来区分音频流和视频流的,这样便于客户端进行解析。

Sequence Number:占 16位,用于标识发送者所发送的 RTP报文的序列号,每发送一个报文,序列号增 1。这个字段当下层的承载协议用 UDP的时候,网络状况不好的时候可以用来检查丢包。同时出现网络抖动的情况可以用来对数据进行重新排序,序列号的初始值是随机的,同时音频包和视频包的 sequence是分别记数的。

Time Stamp:时间戳

实际上,时间戳增加一并不是我们通常意义上的过了一个微秒,而是增加了一个采样间隔那么长的时间。举个例子来说。不同的采集有不同的采样频率,比如一般的音频是 8K的采样频率,也就是一毫秒采集 8次数据,也就是每次采样间隔是 1/8MS,而 timestamp增加 1也就意味着增加了一个采样间隔。也就是过了1/8MS。换个例子,如果令一种编码的采样频率是 16K,那么 timestamp增加 1也就意味着系统过了 1/16MS。也就是说,再同一个系统中,对不同编码,虽然使用同一个时钟,但 timestamp的增长速度是不同的,在这个例子中,采样频率是 16K的编码要比 8K的快两倍,请记住这个区别。

SSRC:占 32位,用于标识同步信源。该标识符是随机选择的,参加同一视频会议的两个同步信源不能有相同的 SSRC。

CSRC list:每个 CSRC标识符占 32位,可以有 0~15个。每个 CSRC标识了包含在该 RTP报文有效载荷中的所有特约信源。

后续的 Media payload就是音频数据了

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

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

相关文章

Redis 之三:Redis 的发布订阅(pub/sub)

概念介绍 Redis 发布订阅 (pub/sub) 是一种消息通信模式,它允许客户端之间进行异步的消息传递 Redis 客户端可以订阅任意数量的频道。 模型中的角色 在该模型中,有三种角色: 发布者(Publisher):负责发送信…

vue2 element 实现表格点击详情,返回时保留查询参数

先直观一点,上图 列表共5条数据,准备输入Author过滤条件进行查询 进入查看详情页,就随便搞了个按钮 啥都没调啦 点击返回后 一开始准备用vuex做这个功能,后来放弃了,想到直接用路由去做可能也不错。有时间再整一套…

【VTKExamples::PolyData】第四十四期 ProcurstesAlignmentFilter

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例ProcurstesAlignmentFilter,并解析接口vtkProcurstesAlignmentFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^…

jupyter 一键快捷启动方法研究

1.效果 首先打开dat 文件,同意赋予管理员 输入序号1 成功启动 2.Bat代码 %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&e…

mac使用sequl的报错说明

出现下图错误,则到此地址下载test-builds版本 Test Builds 使用 sequel pro 的时候出现了 SequelPro encountered an unexpected error 表现为:测试通过,链接就卡住报错的问题。 解决办法 这是软件的问题,下载使用这个 TEST…

大模型理论基础(so-large-lm)课程笔记!

Datawhale干货 作者:辣条,Datawhale优秀学习者 前 言 在当前信息时代,大型语言模型(Large Language Models,LLMs)的发展速度和影响力日益显著。随着技术进步,我们见证了从基本的Transformer架构…

计算机视觉基础知识(二)---数字图像

像素 像素是分辨率的单位;构成位图图像的最基本单元;每个像素都有自己的颜色; 图像分辨率 单位英寸内的像素点数;单位为PPI(Pixels Per Inch),为像素每英寸;PPI表示每英寸对角线上所拥有的像素数目:,x:长度像素数目,y:宽度像素数目,Z:屏幕大小;屏幕尺寸(大小)指的是对角线长…

程序媛的mac修炼手册-- Node.js入门篇

最近因为参与一个微信小程序的开发,开始摸索JavaScript。期间,需要基于Node.js安装微信开发工具的依赖项,所以又顺带学习了Node.js的包管理工具npm(Node Package Manager)。不过,之前看到国外的全栈大佬​​…

electron+vue3全家桶+vite项目搭建【29】封装窗口工具类【3】控制窗口定向移动

文章目录 引入实现效果思路声明通用的定位对象主进程模块渲染进程测试效果 引入 demo项目地址 窗口工具类系列文章: 封装窗口工具类【1】雏形 封装窗口工具类【2】窗口组,维护窗口关系 很多时候,我们想直接让某个窗口移动到边角&#xff0c…

MySQL之索引详解

华子目录 索引概述优缺点 索引的原理索引的设计原则索引结构B-tree(多路平衡查找树)BtreeHash 为什么InnoDB存储引擎选择Btree?索引分类聚集索引选取规则 单列索引和多列索引前缀索引创建索引1.创建表时创建索引2.在已经存在的表上创建索引3.…

funasr VAD语音端点检测;sherpa VAD+STT识别

1、VAD 语音端点检测(funasr) Voice Activity Detection 语音活性检测(VAD)也被称为语音端点检测,基本原理是判断一个区间内的音频(区间被称为一个“语音帧”),是有效语音,还是无效语音。通过连续的检测多帧,就能判断出语音的“开头”(从无效到有效)和“结尾”(从…

【springboot】乡镇卫生院、二甲医院云HIS运维平台源码

目录 云HIS运营管理 ​编辑电子病历主模块:包括门诊电子病历、住院电子病历等子模块 (1)门诊电子病历功能简介 (2)住院电子病历功能简介 ▶患者列表主模块:包括患者信息子模块 (1&#xf…

熔断降级 spring事务

如果有事务处理,会先把事务的自动提交给关闭

《一》在Vue中搭建Three.js环境(超详细、保姆级),创建场景、相机、渲染器

目录 Three.js简介创建vue项目引入Three.js实际操作环节文件目录创建初始化场景、相机 Three.js简介 Three.js 是一款基于 WebGL的 JavaScript 3D 库,它封装了 WebGL API,为开发者提供了简单易用的 API 来在 Web 浏览器中展示 3D 图形。Three.js 提供了…

青岛琛蓝健康集团正式发布多项科研合作项目

青岛琛蓝健康集团正式发布多项科研合作项目 科技创新是推动琛蓝健康产业集团持续发展的原动力。 一直以来,琛蓝健康集团高度重视科研合作,与众多专家团队和科研机构达成战略合作关系,深入实施产学研合作模式,成立多个协同创新中心…

经典思路!人参叶际微生物如何发8分文章?

中国中医科学院中药研究所在《Environmental Microbiome》期刊上(IF7.9)发表了关于叶际真菌微生态网络的文章,该研究通过对ITS测序结果和环境因子测定结果以及皂苷含量测定结果进行生信分析,提出了维持微生态网络的稳定性策略和影响皂苷含量的因素。 期刊…

【推荐算法系列十七】:GBDT+LR 排序算法

排序算法经典中的经典 参考 推荐系统之GBDTLR 极客时间 手把手带你搭建推荐系统 课程 逻辑回归(LR)模型 逻辑回归(LR,Logistic Regression)是一种传统机器学习分类模型,也是一种比较重要的非线性回归模型&#xff…

2024年短剧项目怎么做?教你搭建自己的短剧及cps分销平台app小程序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、短剧系统 二、短剧cps分销平台 三、海外短剧系统 总结 前言 短剧系统分为三种: 短剧系统、短剧cps分销平台、海外短剧系统。今天简单介绍…

【C语言】剖析qsort函数的实现原理

主页:17_Kevin-CSDN博客 专栏:《C语言》 本文将从回调函数,qsort函数的应用,qsort函数的实现原理三个方面进行讲解,请自行跳转至相对位置进行阅读~ 目录 回调函数 qsort函数的应用 qsort函数实现原理 回调函数 什…

【推荐】免费AI论文写作神器-「智元兔 AI」

还在为写论文焦虑?免费AI写作大师来帮你三步搞定! 智元兔AI是ChatGPT的人工智能助手,并且具有出色的论文写作能力。它能够根据用户提供的题目或要求,自动生成高质量的论文。 不论是论文、毕业论文、散文、科普文章、新闻稿件&…