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

2024-03-04 10:12

本文主要是介绍【蓝牙协议栈】【BR/EDR】【AVDTP】音视频分布传输协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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就是音频数据了

这篇关于【蓝牙协议栈】【BR/EDR】【AVDTP】音视频分布传输协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/772854

相关文章

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

通过C#和RTSPClient实现简易音视频解码功能

《通过C#和RTSPClient实现简易音视频解码功能》在多媒体应用中,实时传输协议(RTSP)用于流媒体服务,特别是音视频监控系统,通过C#和RTSPClient库,可以轻松实现简易的音视... 目录前言正文关键特性解决方案实现步骤示例代码总结最后前言在多媒体应用中,实时传输协议(RTSP)用于流媒体服

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

开放式耳机好用?平价开放式耳机推荐?四款开放式的蓝牙耳机推荐

开放式耳机好用吗?有平价些的开放式耳机推荐吗?那这两个问题的回答当然是肯定的。 首先开放式耳机好不好用取决于对耳机的需求,因为开放式耳机其实是比较适用于需要注意周围环境、需要‌长时间佩戴舒适以及需要频繁与人交流的场景中,在这些场景下使用开放式耳机的话就会比较有优势。就例如跑步骑行健身等运动的时候,能够兼得佩戴舒适度的同时,增加一定的安全性;还有在办公学习的时候,会很适合长时间佩戴,能够方便和

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理(三次握手、四次挥手) 三次握手(建立TCP连接) 四次挥手(断开连接)  4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答  9.基于字节流 10.异常情况的处理 小结  前言 在前面,我们已经讲解了有关UDP协议的相关知识,但是在传输层,还有