蓝牙A2DP和HFP编解码

article/2025/6/19 12:38:09

 一、A2DP

        A2DP全名是(Advanced Audio Distribution Profile) 蓝牙音频传输模型协定,提供通过蓝牙连接传输音频流的能力,比如手机播放音乐,蓝牙耳机通过蓝牙连接听歌。

        mp3和flac音频编码都是在PCM音频编码基础上二次编码得到的,其目的是减小文件体积。那么,在音频播放 (playback) 时,就需要把mp3,flac等编码格式的数据还原为PCM编码格式的数据,这个过程叫做解码。然后经过数字-模拟转换(DAC)变成模拟信号,最后经过放大电路驱动喇叭,将声音播放出来。

        A2DP主要有SBC、AAC、AptX、LDAC、LHDC这几种解码方式,下面分别介绍一下这些解码方式。

        1、SBC

        SBC全称Subband Codec,子带编码SBC是专为蓝牙设计的音频编码,复杂度低,可在中等比特率下实现较高音频质量。

        1)SBC编码的基本原理是把信号的频率分为若干子带,然后对每个子带进行编码,并根据每个子带的重要性及特点分配不同的位数(采样深度)来表示数据。
        例如,在音频编码中,由于人耳对不同频率的敏感度不同,可以在对人耳敏感的子带使用较细的量化(较大的采样深度),对人耳不敏感的子带使用较粗糙的量化(较小的采样深度),从而在不降低主观听觉效果的情况下达到较好的压缩效果。
        又例如,离散余弦变换(DCT)时一种处理数字信号的方法,广泛应用有语音和图像压缩。声音经过离散余弦变换(DCT)以后,其系数更多的集中在较低序号的部分。对变换后的高序号部分的编码就很简单,可以用很小的采样深度对其进行编码。


        上图是变换前的信号,下图是DCT变化以后的序号,变换后适合子带编码。

        2)SBC编码过程


        SBC编码的输入是PCM数据,即采样后的时间序列,输出是二进制流。时间序列经过分析过程,转化为频域信号,然后对频域信号分段编码。为每一个子频段指定一个scalfactor及采样深度,对这个子频段的数据进行自适应PCM编码(Adaptive Pulse Code Modulation)。然后把各个子频段编码后的数据打包,作为一帧数据,以二进制流的方式输出。

        (1)Analysis Filter
其目的是为了把时间序列变换到频域,使用的方法是多相滤波器组。子频段的个数可以是4个或8个,对应不同的多相滤波器组。
        (2)Scale Factors计算
每一个子频段的幅值的范围是不同的,取每一个子频段幅值的最大值作为这个子频段的scale factor。比如子频段1的幅值分布在(0, 128)区间,子频段2的幅值分布在(0, 32)区间,那么自定子频段1的scale factor为128, 子频段2的scale factor为32。
        (3)Bit Allocation
每一个子频段有若干幅值需要编码,每个幅值需要用若干比特数来表示。同一个子频段中每个幅值的比特数相同,不同子频段幅值分配的比特数不同。为每个子频段分配幅值比特数的过程叫做bit allocation。
     (4)APCM
根据每个子频段的scale factor及每个幅值需要的比特数,对每一个子频段进行编码的过程。得到每个子频段的量化结果,即Quantized Subband。
     (5)BItStream packing
把每个子频段编码后的结果组合起来,加上校验码、帧头信息等的过程。

        3)关于SBC编码的一些性质
        SBC是有损编码,由于无线传输的带宽有限,SBC在对每个子频段进行编码时,进行了有损处理,以达到数据压缩的目的。即经过SBC编解码以后,PCM数据发生了变化。因此蓝牙设备的音质不是很好。
        SBC支持的采样率包括44.1kHz、48kHz、32kHz、16kHz。SBC支持单声道(MONO CHANNEL)、双声道(DUAL CHANNEL)、立体声(stereo)、联合立体声(Joint Stereo)。

        2、AAC

        AAC全称Advanced Audio Coding,高级音频编码,1997年诞生,基于MPEG-2技术。2000年在MPEG-4基础上更新。

        作为mp3的后继者,AAC相较于MP3的改进有:更多的采样率选择(8 KHz至96 KHz,MP3为16 KHz至48 KHz);更高的声道数上限(48个,MP3在MPEG-1模式下为最多双声道,MPEG-2模式下5.1声道);任意的比特率和可变的帧长度。

        AAC是一种高压缩比的音频编码,主要采取两种策略:舍去与感知上无关的信号成分,去除编码后信号的冗余部分。实际上,在128Kbps比特率以下,AAC编码的效果是最好的,杜比实验室认为:AAC格式在96Kbps比特率上的表现超过了128Kbps的MP3格式;同样是128Kbps,AAC格式的音质明显好于MP3。

        AAC在蓝牙中常用的比特率是256Kbps。但是有一点,即使使用AAC音频源,蓝牙并不能直接传输其原数据流,而是先将AAC解码成PCM,然后再编码成蓝牙支持的AAC编码再传输。应用上,AAC编码最大的支持者是苹果,iPhone、iPad和AirPods等设备都支持AAC,iTunes软件里的音乐很多也是以AAC编码格式存储的。

        3、Aptx

        aptX原名叫apt-X,CSR在2010年将其收购,改名为aptX,而CSR于2015年被高通收购。

        aptX的设计基于自适应差分脉码调制(ADPCM)原理,并没有使用心理声学或掩蔽效应技术(mp3,SBC,AAC中使用)。目前aptX共有四个版本,对比如下:

        aptX的四个版本各有所长。aptX是最基础的版本。aptX Low Latency简称aptX LL,特点在于低延迟。其实人耳可以感觉到的延迟极限是70ms,而达到40ms则意味着我们不会感觉到延迟。aptX HD主打高清音频,传输速率大幅增加,并且有着更高的信噪比和更少的失真。而aptX Adaptive,就如同它名字一样,可以按需自动调节传输比特率和延时。aptX Adaptive向下兼容aptX和aptX HD。

        虽然使用aptX技术需要得到高通的专利授权并支付费用,但在高通的大力推广下,aptX在安卓手机和部分蓝牙耳机上都得到了支持。截止2019年5月,有超过70亿只设备支持了aptX,可以在http://www.aptx.com/product-listing中查询所有支持aptX的设备。

        4、LDAC

        LDAC是索尼开发的一种音频编码,实现了以最高 990Kbps 的比特率通过蓝牙传输 24bit/96kHz 的高分辨率音频(Hi-Res Audio)。高传输码率使得高解析度的音频文件不会被过分压缩,保证了音质。

        如下是来自索尼官网 http://www.sony.net /Products /LDAC的对比图,可以看到,Hi-Res音频通过LDAC编码传输,还可以较好的还原高音质,SBC则较差。

        其实在上两幅对比图中,索尼有夸大LDAC技术之嫌,图片的右下角都标注了 "仅供展示使用"。图一,对于4.5Mbps的Hi-Res音频,要通过最高990Kbps的带宽传输,压缩率需要达到1:4.5,而目前最好的无损压缩率也只有1:2。实际上,LDAC是一种有损编码,即使是最后在耳机端还原成了96KHz/24bit,4.5Mbps的音频,参数上与发送端一致,但是其内容也明显不如原来的好了。所以说,LDAC可以传输CD级音质,但是并不能无损传输Hi-Res音频,只能是接近(程度未知)。

        LDAC提升传输速率的原理是增加了蓝牙通信的信道,这对蓝牙天线的要求也提高了。实际上,在信号较差,或者是受到干扰的时候,LDAC还会以660Kbps或330Kbps的比特率通信,保证连接性。

        2017年,从安卓8.0开始, LDAC加入了安卓开放源代码项目,以后安卓用户也可以用上原本索尼专属的技术了,不过使用LADC解码器(耳机侧)还需要索尼的专利授权。

        5、LHDC

        LHDC全称Low-Latency Hi-Definition Audio Codec,是一种高音质蓝牙编解码方案,由台湾厂商 Savitech 盛微先进科技开发。

        LHDC支持通过速度最高达900kbps的蓝牙连接传输 24bit/96kHz 的串流音频(也称高解析度音频)。与LDAC会先把原始音频进行升/降频到 24bit/96kHz不同,LHDC则可依照原始取样率输出,减少SRC过程的延迟。2019年9月,LHDC通过了JRS的Hi-Res Audio Wireless标准认证。

        LHDC根据信号情况支持400/560/900 kbps的比特率。此外还有低延迟音频编解码器(LLAC)版本,也称为LHDC LL,端到端延迟约为30毫秒。

        在应用上,从安卓10开始,LDAC加入了安卓开放源代码项目。

        6、 总结

        总的来说,从音质上,LHDC ≈ LDAC > aptX > AAC > SBC。

        SBC是蓝牙唯一强制支持的编码,编码方案较为简单,但是比特率较低,压缩率较高,损失了部分细节,音质一般。传输码率是328Kbps,44.1KHz。SBC的传输码率其实和高品质MP3是差不多的,但是因为蓝牙传输中间设备需要转码(压缩),所以同样规格的MP3文件在无线环境下要比有线环境损失更多细节,因此听感也就不如有线传输。早期人们对于蓝牙音频质量普遍不看好,其主要原因也是因为SBC技术自身的瓶颈所导致的

        AAC的码率与SBC相当,但是得益于更好的编码技术,即使在同样的低码率下,AAC的听感也好于SBC和MP3。

        Aptx的传输码率比之前两者略有所提升,同时更为高效的编码使得更多的音频细节能够得以保留,听感好于SBC以及AAC。aptX HD已经属于高清音频编码了。

        LHDC和LDAC类似,都宣称可以传输高于CD音质的音频,传输比特率达900Kbps,是目前音质最好的蓝牙音频编码。

        现在用得最多的就是aac,其次就是aptx,LDAC很少,LHDC就更少了。音质却是反着来的,LHDC最强,LDAC第二,aptx第三,aac第四,但是都比sbc要好

        二、HFP

        HFP(Hands-freeProfile)是免提配置文件,让蓝牙设备可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要视蓝牙耳机及电话是否 支持。

        蓝牙通话过程的语音数据,这种音频对时效性有高要求,一般通过特殊的SCO或eSCO链路传输数据。编码方式有:CVSD、mSBC。最基础的编码方式为CVSD,免提蓝牙设备都需支持该编码方式,支持宽带语音的设备可选mSBC编码数据。

        目前支持两种不同的采样率,分别是CVSD和mSBC,并且在SCO(Synochronous Connection Oriented,同步面向连接链路链路)和eSCO(Extended Synchronous Connection-Oriented )链路下也存在差异。SCO 和eSCO 是主设备对从设备的点对点的逻辑传输。同步逻辑传输用在对时间要求比较严格的场景中,比如音频和同步数据的传输。主设备通过保留的时隙维护逻辑传输中的同步。在eSCO逻辑传输中会利用保留的时隙构成一个重传窗口,eSCO有重传机制。其中CVSD是强制支持的,mSBC是可选项;使用16KHz可以提高语音识别的正确率。

        1、CVSD

        CVSD(Continuous Variable Slope Delta Modulation 连续可变斜率增量调制):该编码方式的数据传输使用 SCO 或 eSCO 链路。链路的选取是根据本端 Controller是否支持 Enhanced Setup Synchronous Connection指令来决定的,如果支持该命令则创建语音音频链路时使用 eSCO,否则创建 SCO 链路。

         CVSD采用8KHz采样,分别为SCO链路下和eSCO链路下不同的配置情况。

        这个链接可以看一下,可以深入一些了解CVSD:连续可变斜率增量调制(CVSD)浅析_NiceBT的博客-CSDN博客_cvsd编码

        2、mSBC
        改良的子带编码技术(modified sub-bandcoding,mSBC):该编码方式的数据传输只能使用 eSCO 链路。

         mSBC采用16KHz采样,使用mSBC需要在eSCO链路上传输。

参考资料:

蓝牙音频编码简介 - SBC、AAC、AptX、LDAC、LHDC_danteliujie的博客-CSDN博客_蓝牙音频编码

蓝牙协议中的SBC编码-汗血宝马

sbc,aac,aptx,ldac蓝牙编码简单介绍。_王俊洁、�的博客-CSDN博客_sbc编码

蓝牙耳机中LHDC、SBC、AAC、AptX、LDAC都是什么?

蓝牙电话之HFP-电话音频_坏小子VP的博客-CSDN博客_cvsd msbc

蓝牙基带 音频_Wireless_Link的博客-CSDN博客


 


http://chatgpt.dhexx.cn/article/rn98sBjt.shtml

相关文章

Rockchip安卓11.0 16k wbs msbc HFP PCM语音通话支持

Rockchip安卓11.0 16k wbs/msbc HFP PCM语音通话支持 调试平台: 安卓11.0, rk3328, 博通ap6212芯片, HFP 8K已经调通的情况下. SDK修改支持16k wbs/msbc HFP PCM语音注意点如下: 1. bluedroid(system/bt) 博通方案中, ESCO_DATA_PATH_PCM 为1代表蓝牙芯片作为pcm master, 6…

蓝牙电话之HFP-电话音频

蓝牙电话之HFP协议中的电话音频 蓝牙技术通信的内容多种多样,其中音频部分包含媒体音频和电话音频。 媒体音频:播放蓝牙音乐的数据,这种音频对质量要求高,数据发送有重传机制,从而以l2cap的数据形式走ACL链路。编码方…

VSCode 按下tab键自动补全功能失效

问题描述:标签自动补全插件已经安装,某天按下tab键自动补全标签的功能突然失效了。解决方法: 1、找到路径 file > Preferences >settings 2、搜索tabs,选择Extensions里面的Emmet,将复选框的√打上就ok啦!

javascript 按下回车键触发input表单的切换(enter键代替tab键功能)

本来是想用js代码去模拟键盘按下来实现该功能&#xff0c;但是没有实现到。后来想到一种比较笨的方法。局限性是只能这些表单元素只能在同个层面下才能切换。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><m…

sublime text3 tab键功能失效

选择首选项 -> 快捷键设置 出现下面编辑页 在右边添加下面一些设置&#xff08;记得要用逗号与前面内容分开&#xff09;&#xff1a; { "keys": ["tab"], "command": "reindent", "context":[{ "key": "…

计算机键盘上的2个定位键,电脑键盘上Tab 键的神奇之处!(用途详解)

下面通过实例来详细解释下&#xff1a; 假设“D:\cfan”路径下&#xff0c;有文件夹&#xff1a; a、 ab &#xff0c;有文件&#xff1a; abc.txt &#xff0c; ac.txt 。依次点击“开始→运行”输入“cmd”&#xff0c;按下回车打开命令提示符。先输入“D:”&#xff0c;回车…

微型计算机上的tab作用,TAB键有什么用处

Tab键对大家来说都是比较熟悉吧。比如写文章时开头要空两格就可用这个键。但是它还有什么特殊功能呢&#xff0c;不一定是大家都知道的。下面小编来详细的介绍下几种tab键的常见功能 tab键作用一&#xff1a;改变焦点 聚焦到下一个按钮&#xff0c;输入框或者链接等。例如&…

计算机键盘上的tab键是什么键,电脑Tab键有什么用处

电脑Tab键有什么用处 Tab键对大家来说都是比较熟悉吧。比如写文章时开头要空两格就可用这个键。但是它还有什么特殊功能呢&#xff0c;不一定是大家都知道的。下面小编来详细的介绍下几种tab键的常见用处&#xff1a; tab键作用一&#xff1a;改变焦点 聚焦到下一个按钮&#x…

电脑Tab键有什么功能?6个实用功能总结!

我最近对电脑的键盘很有兴趣&#xff0c;想了解一下各个键有什么特殊的用法。今天正好看到Tab键&#xff0c;想问下大家知道电脑的Tab键有什么比较好用的功能吗&#xff1f; 在电脑键盘上&#xff0c;Tab键是一个常见的键&#xff0c;它具有多种功能和用途。无论是在文本处理、…

tab键功能

tab 键可以实现命令及路径等补全&#xff0c;提高输入效率&#xff0c;避免出错 tab键可以命令补全&#xff0c;还有路径、文件名补全。 命令补全&#xff1a; 在Linux命令行下&#xff0c;输入字符后&#xff0c;按两次Tab键&#xff0c;shell就会列出以这些字符打头的所有…

计算机键盘上的tab键是什么键,键盘Tab键有什么作用?

Tab键——跳格键&#xff0c;大家都比较熟悉了吧&#xff0c;但是到底它有什么特殊的使用功能&#xff0c;却未必是大家都知道的哦。今天就将Tab键的几种使用功能进行了整理&#xff0c;大家可以参考学习学习。 1、跳格。当我们在网页输入表单的时候&#xff0c;在一个输入控件…

电脑Tab键有什么用

Tab键对大家来说都是比较熟悉吧。比如写文章时开头要空两格就可用这个键。但是它还有什么特殊功能呢&#xff0c;不一定是大家都知道的。下面我来详细的介绍下几种tab键的常见用处&#xff1a; tab键作用一&#xff1a;改变焦点 聚焦到下一个按钮&#xff0c;输入框或者链接等…

电脑Tab键有什么功能?分享Tab键的6个妙用

Tab键tabulator key 的缩写&#xff0c;意思是跳格键。基本用法是可以用来绘制无边框的表格&#xff0c;还可以在单词间留下间隔&#xff0c;一般等于八个空格的长度。但是您知道电脑Tab键有什么功能吗&#xff1f;以下一些关于Tab键的使用和功能的介绍&#xff0c;希望这些可以…

matlab EOF程序

% eof第一模态图用变量eof的第一列&#xff0c;以此类推&#xff1b;相应的时间系数用pc第一行 clear clcx [2 6 1 5 2;9 4 0 5 4;12 2 55 9 10;4 55 78 2 13]; %原始数据&#xff0c;列为站点或格点&#xff0c;行为时间序列上的值 x(1,:) x(1,:) - mean(x(1,:)); x(…

C语言——EOF的用法——while(scanf(“%d“,num)!=EOF)

简介&#xff1a; EOF是一个计算机术语&#xff0c;为End Of File的缩写&#xff0c;在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。通常在文本的最后存在此字符表示资料结束。、 概念&#xff1a; 在C语言中&#xff0c;或更精确地说成C标准函数库中…

cat << EOF 什么意思?

cat <<EOF 什么意思&#xff1f; cat命令表示查看&#xff0c;而cat <<EOF命令表示将进行输入&#xff0c;直到以EOF终止符来结束输入&#xff08;最后的新行&#xff09;。EOF必须写在一行的头部&#xff0c;前面不能有制表符或者空格。如果结束符EOF前面有制表符…

【C语言中的EOF】零基础看懂EOF如何使用while(scanf(“%d %d”,a,b)感叹号=EOF)

&#x1f31f;前言 ✨如今我们努力奔跑&#xff0c;不过是为了追上那个曾经被寄予厚望的自己&#xff01; 【&#x1f47b;&#x1f47b;&#x1f47b;大家好&#xff0c;我是姜姜爱柚子&#xff0c;将在这里分享所学所得&#xff0c;如果有不正确的地方&#xff0c;希望大家多…

c语言中eof的作用,eof在c语言中表示什么

eof在c语言中表示文件结束符。在while循环中以EOF作为文件结束标志&#xff0c;这种以EOF作为文件结束标志的文件&#xff0c;必须是文本文件。在文本文件中&#xff0c;数据都是以字符的ASCII码值的形式存放的。 在C语言中&#xff0c;或更精确地说成C标准函数库中表示文件结束…