A2DP协议笔记

摘要:
A2DP协议的音频数据在ACLLink上传输,这与在SCO上传输的语音数据不同。A2DP不包括远程控制功能。远程控制功能指协议AVRCP。AVDTP定义了蓝牙设备之间数据流句柄的参数协商、建立和传输过程以及相互交换的信令实体形式。它是A2DP框架的基本协议。A2DP与相关协议之间的联系如下图所示:A2DP在协议栈中的位置如下图所述:注意数据打包过程。源和接收器的实例:3。A2DP协议不支持同步的点对多点分发。

1.概述

    A2DP(Advanced Audio Distribution Profile)是蓝牙的音频传输协议,典型应用为蓝牙耳机。A2DP协议的音频数据在ACL Link上传输,这与SCO上传输的语音数据要区别。A2DP不包括远程控制的功能,远程控制的功能参考协议AVRCP。AVDTP则定义了蓝牙设备之间数据流句柄的参数协商,建立和传输过程以及相互交换的信令实体形式,该协议是A2DP框架的基础协议。A2DP与相关协议的附属关系如下图:
A2DP协议笔记

A2DP在协议栈中的位置如下图所示:
A2DP协议笔记
注意下数据包装的过程。
2.A2DP的一些定义
GAVDP定义了两种角色:
Initiator (INT) – This is the device that initiates a signaling procedure.【发起signaling的】
Acceptor (ACP) – This is the device that shall respond to an incoming request from the INT.【响应signaling的】
A2DP在此基础上具体实现了连个角色:
Source (SRC) – A device is the SRC when it acts as a source of a digital audio stream that is delivered to the SNK of the piconet.【输出音频stream的】
Sink (SNK) – A device is the SNK when it acts as a sink of a digital audio stream delivered from the SRC on the same piconet.【接受音频stream的】
这里需要注意的是:一般在A2DP中Source和Sink的角色是固定的,而GAVDP的这两个角色是可以互换的,只要是发起signaling的一方就为initiator。
一个Source和Sink的实例:
A2DP协议笔记

3.A2DP协议的限制
(1)不支持synchronized point-to-multipoint distribution。
(2)在Source和Sink端存在延迟。
(3)音频数据的速率必须足够小于蓝牙的传输速率。
(4)不提供任何数据保护的方法
 
4.编码
    传输音频数据必须在Source端编码,在Sink端解码。A2DP规定了下面几种编码类型:
A2DP协议笔记

SBC是强制支持的(Mandatory Codec),其余三种可选(Optional Codec),除了这些外,也可以有厂家自己的编码形式(Vendor Specific A2DP Codecs)。
 
5.SBC编码格式
   SBC是A2DP规定的强制支持的编码格式,这里我们具体只讨论这一种编码格式:
A2DP协议笔记
参数Sampling Frequency:
 
A2DP协议笔记 A2DP协议笔记
Sink端必须支持44100和48000这两种frequency,Source端支持一种就行。
 
参数Channel Mode:
A2DP协议笔记

参数Block Length:
A2DP协议笔记
  
参数Subbands:
A2DP协议笔记

参数Allocation Method:
A2DP协议笔记
 
参数Minimum / Maximum Bitpool Value:
A2DP协议笔记

6.Media Packet Header与Media payload:
    在第一部分数据的包装中可以看出,在每一个Media payload上都会加上Media packrt header。主要包括以下几个部分:
Timestamp (TS),Payload Type (PT),Marker (M) bit【置为全0】,Extension (X) bit【不使用,置为全0】。具体在AVDTP协议中定义,这里不详述。
Media payload的格式如下:
A2DP协议笔记
其中Media Payload的Header部分的格式如下:
A2DP协议笔记
F bit – Set to 1 if the SBC frame is fragmented, otherwise set to 0.
S bit – Set to 1 for the starting packet of a fragmented SBC frame, otherwise set to 0.
L bit – Set to 1 for the last packet of a fragmented SBC frame, otherwise set to 0
RFA – 置为0.
Number of frames (4 bits) – If the F bit is set to 0, this field indicates the number of
frames contained in this packet. If the F bit is set to 1, this field indicates the number
of remaining fragments, including the current fragment. Thus the last counter value
shall be one. For example, if there are three fragments then the counter has value 3,
2 and 1 for subsequent fragments. This field is expressed by 4 bit UiMsbf.
 
7.A2DP的通信过程
A2DP规定Sink个Source端有三种状态:IDLE、OPEN和STREAM,通过下图的流程进行状态转换:
A2DP协议笔记
Connection Establishment:
A2DP协议笔记
前提是L2CAP首先建立signaling Channel.
Start Streaming:
A2DP协议笔记

OPEN状态下经过Start Stream 过程就转换到STREAMING状态。
Connection Release:
A2DP协议笔记

在OPEN和STREAMING状态下都可以通过Stream Release过程变为IDLE状态。
Suspend:
A2DP协议笔记

只能从STREAMING状态通过Stream Suspend过程变为OPEN。
Change Parameters:
A2DP协议笔记

免责声明:文章转载自《A2DP协议笔记》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十九:LCD模块dos 日期时间格式设置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

kernel: blk_update_request: I/O error, dev fd0, sector 0

检查后,控制台无法登录。重新启动虚拟机,报告下图,然后执行journalctl以显示以下系统消息日志原因搜索。。。...

VMware vSphere 7.0 安装教程

插入CD,启动系统并等待安装包加载映像,按Enter等待协议条款,同意,然后按F11进行磁盘分区管理。由于测试环境的原因,只有一个硬盘,直接按Enter键进入键盘布局,选择默认设置,按Enter键设置根帐户的密码,输入完成后按Enter键确认安装,按F11键等待安装完成,取出安装CD,重新启动后按Enter重新启动系统,正在加载到系统中…请确保已导入磁盘。错...

js 预览 excel,js-xlsx的使用

js-xlsx简介SheetJS生成的js-xls x是一个非常方便的工具库,只能使用纯js读取和导出excel。它功能强大,支持多种格式,支持xls、xlsx和ods等十几种格式。本文以xlsx格式为例。官方github:https://github.com/SheetJS/js-xlsx支持演示在线演示地址:http://demo.haoji.me/20...

Revit导入lumion渲染

利用Revit导出DAE文件格式插件,可以将Revit模型导入到lumion中进行图片渲染和漫游动画的制作。lumion强大的漫游功能,丰富的附加组件,绚丽的视频特效。lumion没有建模功能,但是Revit建模的没有统一的标准,导致一些不该同样的材质的地方,无法更改;如果有统一的标准,那么Revit结合lumion能做出任何想要的效果。Revit13版本能...

nginx重启

方法二:在启动命令-c前加-t2、重启Nginx服务方法一:进入nginx可执行目录sbin下,输入命令./nginx-sreload即可方法二:查找当前nginx进程号,然后输入命令:kill-HUP进程号实现重启nginx服务...

微信小程序-获取input值的两种方法

1、bindinput其中e.detail是获取input数据其中包含value值,cursor是获取光标的位置。...