蓝牙aac编解码

2018-02-02 10:03:35 zhanghuaishu0 阅读数 7442

 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 XX  作       者:ZHS(文化人)

 XX  联系方式:文章末尾Chat快问

 XX  版权声明:原创文章,欢迎评论和转载~转载时能告诉我一声就最好了

 XX  要说的话:作者水平有限,难免有不足之处,恳请指正!

 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX    

         写在前面:最近接触了几种蓝牙音频编码格式,以下是搜集到的资料,笔者做了下整理;

      SBC (Sub-band coding,子带编码)

最早的格式应该是SBC,SBC是A2DP(Advanced Audio DistribuTIon Profile,蓝牙音频传输协议)协议强制规定的编码格式。所有的蓝牙都会支持这个协议,所以所有的蓝牙音频芯片也会支持这个协议。SBC编码在传输时的码率具体参数未找到,根据sony官网宣传给出的资料,是:328Kbps,44.1KHZ。

这个码率其实和高品质的MP3差不多。但因为蓝牙传输中间设备是需要转码,以MP3文件为例,转码过程为 MP3-》PCM-》SBC-》PCM, 每次转码都会损失细节,导致SBC的听感会比原始的MP3要差。

优点:可以利用人耳(或人眼)对不同频率信号的感知灵敏度不同的特性,在人的听觉(或视觉)不敏感的部位采用较粗糙的量化,在敏感部位采用较细的量化,以获得更好的主观听觉(视觉)效果。例如,语音的基音和共振峰主要集中在低频段,因此可分配较多的比特来表示其样值;而对出现摩擦音和类似摩擦噪声的高频段可以分配较少的比特,从而可以充分地压缩语音数据。

各子带的量化噪声都束缚在本子带内,这样就可以避免能量较小的频带内的信号被其它频段中的量化噪声所掩盖。

滤波器的具体实现不可能是理想的带通,其幅度影响不可避免地带有有限的滚降。因此在划分子带时,只能使子带间有交叠或者使子带间有一定的间隙。前者若按奈氏频率取样将会产生混叠失真,而后者使原有的部分频带经滤波而损失掉,重建的信号会有失真。针对这个问题的解决方法有正交镜像滤波法和时域混叠消除法。

      ACC(Advanced Audio Coding,高级音频编码)

AAC(Advanced AudioCoding),中文名:高级音频编码,出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。

AAC,全称AdvancedAudio Coding,是一种专为声音数据设计的文件压缩格式。与MP3不同,它采用了全新的算法进行编码,更加高效,具有更高的"性价比"。利用AAC格式,可使人感觉声音质量没有明显降低的前提下,更加小巧。苹果ipod、诺基亚手机支持AAC格式的音频文件。

优点:相对于mp3,AAC格式的音质更佳,文件更小。

不足:AAC属于有损压缩的格式,与时下流行的APEFLAC无损格式相比音质存在"本质上"的差距。加之,传输速度更快的USB3.0和16G以上大容量MP3正在加速普及,也使得AAC头上"小巧"的光环不复存在。

折叠压缩算法

作为一种高压缩比的音频压缩算法,AAC通常压缩比为18:1,也有资料说为20:1,远胜mp3,而音质由于采用多声道,和使用低复杂性的描述方式,使其比几乎所有的传统编码方式在同规格的情况下更胜一筹。不过直到2006年,使用这一格式储存音频的并不多,可以播放该格式的mp3播放器更是少之又少,前所知仅有苹果iPod,而手机支持AAC的相对要多一些,此外电脑上很多音频播放软件都支持AAC格式,如苹果iTunes。

折叠运算法则

AAC所采用的运算法则与MP3的运算法则有所不同,AAC通过结合其他的功能来提高编码效率。AAC的音频算法在压缩能力上远远超过了以前的一些压缩算法(比如MP3等)。它还同时支持多达48个音轨、15个低频音轨、更多种采样率和比特率、多种语言的兼容能力、更高的解码效率。号称「最大能容纳48通道的音轨,采样率达96 KHz,并且在320Kbps的数据速率下能为5.1声道音乐节目提供相当于ITU-R广播的品质」。

总之,AAC可以在比MP3文件节省大约30%的储存空间与带宽的前提下提供更好的音质。但是在空间上和结构上AAC和mp3编码出来后的风格不太一样,喜欢与否属于仁者见仁智者见智的事情。

      APTX

APTX是CSR公司的专利编码算法,在被高通收购后,APTX在安卓手机里面推广力度很大。 

根据官网介绍,aptX分为三种:aptX,aptX HD和aptX Low Latency,根据名字可以认为,分别是传统aptX,高品质aptX(估计是提高码率)和低时间延迟aptX(在看视频和打CS的时候时间延迟就很重要了)。

The Qualcomm® aptX™ audiocoding algorithm originated in the late 1980s at Queen’s University Belfast.This innovaTIve work was focused on bitrate reducTIon and achievedsignificant bit rate efficiencies while preserving audio quality.

aptX has been the bestkept secret of the professional audio industry, used by major public broadcasters and filmstudios around the world. Now available on leading consumer devices, aptX enables music lovers to enjoy the rich listening experience thataptX delivers.

高通的意思大概是,aptX是我家的,然后是女王大学在上世纪八十年代开始研发的音频编码算法,这种算法具有很高的比特率效率的同时保持了很高的音频质量。aptX作为专业的无线音频传输方案,被应用在公共广播和电影音响里面,现在终于要放在消费产品里面了。

所以aptX其实传输码率估计也不高,可能和前面两者差不多,但是得益于高效的编码,使得声音保留的细节更多,实际听感好于前面两者,aptX的宣传也是称其可以达到CD级别的听感。

Apt-X是一种基于子带ADPCM(SB-ADPCM)技术的数字音频压缩算法。原始算法由Stephen Smyth 博士于20世纪80年代提出。由Audio Processing Technology(现已被CSR合并)公司发展并命名为apt-X。最初用于专业音频与广播领域。近几年,在 Bluetooth无线音频传输领域apt-x由于其低延时,容错性好,高音质等优点大有取代SBC(Sub-band Coding)之势。目前apt-x家族中实用的有有aptX Bluetooth, aptX Enhanced, aptX Live(2007年推出),aptX Lossless(2009年推出)。apt-X具有以下特点:

所需频宽:10Hz to 22.5 kHz,56kbit/s to 576 kbit/s(16 bit 7.5 kHz mono to 24-bit, 22.5kHz stereo)

Apt-X的使用主要集中在蓝牙耳机和蓝牙音箱,其终端和蓝牙耳机 音箱都必须支持Apt-X才能发挥其功能。蓝牙音频传输存在一定延迟。最大的感受是影音延迟可以降到最低。

      LDAC

LDAC很简单粗暴的提高了信道,在支持LDAC的设备上面,蓝牙的通信码率接近1M。

LDAC可传输约3倍于普通Bluetooth*1的数据(在最高990kbps的传输速度下*2),让你在无线情况下欣赏Hi-Res Audio*3音乐时,可以聆听到接近Hi-Res Audio的音质。

在这么高的传输速度下面,传输无损音乐成为了可能。当然,这种近乎私有协议的传输格式,也导致现在只有少量设备兼容。 但毫无疑问,LDAC在传输速率上获得了很大的提升,使得传输的音频品质更高,听感自然是最好的。

LDAC是索尼研发的一种无线音频编码技术,它最早在 2015 年的CES消费电子设备大展上亮相。在当时,索尼表示比起标准的蓝牙编码、压缩系统,LDAC 技术要高效三倍之多。这样一来,那些高解析度的音频文件在进行无线传输的时候就不会被过分压缩,以至于极大损失音质了。

索尼的这个决定之所以让人颇为在意,是因为 LDAC 技术在过去几乎算是“索尼专用”,只在它自家的手机、播放器、耳机、蓝牙音箱上应用。因为 LDAC 技术依赖音源和扬声系统的同时支持,这让该技术成为了索尼设备的独占亮点。而如今,只要是安装了 Android O 的手机,就都能够利用 LDAC,在支持该技术的播放系统上让用户享受无线的高清音乐了

      总结

        SBC一般的音频格式,蓝牙传输在不支持AAC,aptx的时候都用SBC传输,音质一般,现在80%都是这种格式;

        AAC,当蓝牙支持AAC格式的文件,手机也支持AAC传输时,音质比SBC好很多,普通人听的出来这种区别,

        APTX,是蓝牙传输的一种无损格式,由csr推广,在设计初期,要支持APTX,就必须要购买这个软件费用,并且aptx并不是大多数手机都支持,一般支持的手机在背后都有aptx的logo ,所以虽然效果好,但是真正可以支持的设备端其实不多。

        比如,你的手机是iphone的时候,你的耳机或者喇叭也支持AAC,播放出来的格式自然就是AAC ;
如果你的手机是支持APTX, 那你的懒吧和耳机也支持APTX,播放出来的自然是APTX,但同时,你记得你的歌曲本身也是无损的才行!

        这几个没有什么必然联系,大不了就是你的蓝牙支持APTX,AAC,SBC,但你的手机放出来格式是sbc,那播放出来的自然是sbc的音乐。反之你的手机支持aac传输,但你的蓝牙只支持sbc,那播放出来的肯定就是sbc的格式文件了,这是肯定的,别弄混了!

        蓝牙音乐的格式有sbc,aac,mp3,aptx, 但实际播放的音乐格式还有什么杜比音效什么的,太多了,只是付钱给不同的音效格式厂家,然后看哪家的厂家在音效上面做的好,推广面积大而已。。。。你要用好的音质,就不要用蓝牙了,反之,蓝牙就是便捷,无线~~~

2018-06-08 10:40:45 jrunw 阅读数 135315

以下当前较为常用的几种音频传输格式和支持厂商。下面按照编码的码率由低到高列举。

  1. SBC (Sub-band coding,子带编码)

    最早的格式应该是SBC,SBC是A2DP(Advanced Audio Distribution Profile,蓝牙音频传输协议)协议强制规定的编码格式。所有的蓝牙都会支持这个协议,所以所有的蓝牙音频芯片也会支持这个协议。SBC编码在传输时的码率具体参数未找到,根据sony官网宣传给出的资料,是:328Kbps,44.1KHZ。这个码率其实和高品质的MP3差不多。但因为蓝牙传输中间设备是需要转码,以MP3文件为例,转码过程为 MP3->PCM->SBC->PCM, 每次转码都会损失细节,导致SBC的听感会比原始的MP3要差。

  2. ACC(Advanced Audio Coding,高级音频编码)

    ACC是杜比实验室为音乐社区提供的技术,是一种高压缩比的编码算法。实际体验上都认为同样的码率下面,ACC的听感比MP3好,apple上面ACC的音频很多。所以现在的iphone的音频传输格式也都是acc格式,码率与SBC相当,但听感据说好于SBC。因为没有做过严肃对比,暂且认为稍微好于SBC。

  3. APTX

    APTX是CSR公司的专利编码算法,在被高通收购后,APTX在安卓手机里面推广力度很大。 官网:http://www.aptx.com/  在官网中的支持设备中看到了oppo和nokia的身影~

    根据官网介绍,aptX分为三种:aptX,aptX HD和aptX Low Latency,根据名字可以认为,分别是传统aptX,高品质aptX(估计是提高码率)和低时间延迟aptX(在看视频和打CS的时候时间延迟就很重要了)。所以aptX其实传输码率估计也不高,可能和前面两者差不多,但是得益于高效的编码,使得声音保留的细节更多,实际听感好于前面两者,aptX的宣传也是称其可以达到CD级别的听感。

  4. LDAC

    现在轮到大法出场了,大法很简单粗暴的提高了信道,在支持LDAC的设备上面,蓝牙的通信码率接近1M。

    LDAC可传输约3倍于普通Bluetooth*1的数据(在最高990kbps的传输速度下*2),让你在无线情况下欣赏Hi-Res Audio*3音乐时,可以聆听到接近Hi-Res Audio的音质。

    在这么高的传输速度下面,传输无损音乐成为了可能。当然,这种近乎私有协议的传输格式,也导致现在只有少量设备兼容。 但毫无疑问,LDAC在传输速率上获得了很大的提升,使得传输的音频品质更高,听感自然是最好的。

2017-04-21 17:50:20 LearnboC 阅读数 313

1. Android 官方的 MediaCodec API

 

首先,我们了解一下 Android 官方提供的音频编解码的 API,即 MediaCodec 类,该 API 是在 Andorid 4.1 (API 16) 版本引入的,因此只能工作于 Android 4.1 以上的手机上。(乐搏学院

 

1.1 MediaCodec 基本介绍

 

(1)提供了一套访问 Android 底层多媒体模块的接口,主要是音视频的编解码接口

 

(2)Android 底层多媒体模块采用的是 OpenMax 框架,任何 Android 底层编解码模块的实现,都必须遵循 OpenMax 标准。Google 官方默认提供了一系列的软件编解码器:包括:OMX.google.h264.encoder,OMX.google.h264.encoder, OMX.google.aac.encoder, OMX.google.aac.decoder 等等,而硬件编解码功能,则需要由芯片厂商依照 OpenMax 框架标准来完成,所以,一般采用不同芯片型号的手机,硬件编解码的实现和性能是不同的

 

(3)Android 应用层统一由 MediaCodec API 来提供各种音视频编解码功能,由参数配置来决定采用何种编解码算法、是否采用硬件编解码加速等等

 

1.2 MediaCodec 核心原理

 

我不准备详细介绍 MediaCodec API 的每个函数是怎么用,示例代码大家可以在后面给出的资源链接中查看和学习。

 

这里我准备重点介绍一下 MediaCodec 的核心工作原理,因为只有搞清楚了这一点,你才会明白为什么 MediaCodec API 提供的接口是这个样子的。

 

MediaCodec 使用的基本流程是:

 

1

2

3

4

5

6

7

8

9

10

11

- createEncoderByType/createDecoderByType

- configure

- start

while(1) {

    - dequeueInputBuffer

    - queueInputBuffer

    - dequeueOutputBuffer

    - releaseOutputBuffer

}

- stop

- release

 

由此可以看到,Buffer 队列的操作是其最核心的部分之一,关于 MediaCodec 的 Buffer 队列 ,示意图如下:

wKioL1cCSojSz4HdAAD0xxQxvwg230.png

 

 

MediaCodec 架构上采用了2个缓冲区队列,异步处理数据,下面描述的 Client 和 MediaCodec 模块是并行工作的(注:这里的 Client 就是指 “开发者,API 的使用者”):

 

(1)Client 从 input 缓冲区队列申请 empty buffer [dequeueInputBuffer]

(2)Client 把需要编解码的数据拷贝到 empty buffer,然后放入 input 缓冲区队列 [queueInputBuffer] 

(3)MediaCodec 模块从 input 缓冲区队列取一帧数据进行编解码处理

(4)编解码处理结束后,MediaCodec 将原始数据 buffer 置为 empty 后放回 input 缓冲区队列,将编解码后的数据放入到 output 缓冲区队列

(5)Client 从 output 缓冲区队列申请编解码后的 buffer [dequeueOutputBuffer]

(6)Client 对编解码后的 buffer 进行渲染/播放

(7)渲染/播放完成后,Client 再将该 buffer 放回 output 缓冲区队列 [releaseOutputBuffer]

 

MediaCodec 在架构上,其实是采用了一种基于“环形缓冲区”的“生产者-消费者”模式,它设计了 2 个基于 idx 序号的“环形缓冲区” ,注意,是 2 个,一个在 input 端, 一个在 output 端。

 

我曾经在 Github 上分享过一段 Linux C 代码,名叫:“rw_queue”,就是这种环形缓冲区的简化版,大家有兴趣可以看看,地址:https://github.com/Jhuster/clib/tree/master/rw_queue

 

基于 idx 的环形缓冲区的总体示意图如下,图中,wp 代表 “写指针”,指向的是 “empty buffer”, 而 rp 代表 “读指针”,指向的是 “filled buffer”:

 

wKioL1cCStbQJjLDAAB7AoEE3KU663.png

“生产者”和“消费者”其实是共用这一个缓冲区队列,“生产者”负责从队列中取出未使用的 Buffer,填入数据,然后放回队列,“消费者”则负责取出填入数据后的 Buffer,进行处理,处理结束后,再把 Buffer 标记为“空”,退回到队列中去以供“生产者”继续填充数据。

 

在 input 端,“Client”是这个环形缓冲区“生产者”,“MediaoCodec 模块”是“消费者”。

在 output 端,“MediaoCodec 模块”是这个环形缓冲区“生产者”,而“Client”则变成了“消费者”。

 

这就是其核心的工作原理,其实并不复杂,大家静下心来,很快就能理解其中的奥妙。

 

1.3  参考资源

 

关于 MediaCodec 的示例代码,网上其实也很多了,我就直接给出一些个人觉得不错的链接,有兴趣的小伙伴们可以去研究一下。

 

(1)Android 官方文档: 《MediaCodec》

(2)《Android MediaCodec stuff》

(3)《HWEncoderExperiments》

(4)一些开源的播放器 Android 源码,如 VLCijkplayer

 

2. 第三方音频编解码的库

 

官方的 MediaCodec API 虽然支持硬件编解码加速,但是问题和局限还是很多的,一方面是只能在 Android 4.1 以上机型上才能使用,另一方面,由于 Android 手机种类繁多,厂商对底层源码的修改各不相同,导致 MediaCodec API 在实际使用中,会遇到很多坑,有很多兼容性的问题,因此,我们也可以考虑采用第三方的编解码库。

 

这里,我简单推荐几款第三方音频编解码库(可以移植到 Android 平台的),大家可以直接去官网或者项目主页了解其详细信息。

 

(1) opus 编解码库

 

很喜欢 opus,低码率下 opus 完胜曾经优势明显的 HE AAC,我曾经用它实现了一款 Android 局域网的VoIP网络电话应用:“飞鸽电话”,效果很不错。

 

opus 官网地址:https://www.opus-codec.org

 

注:如今 Android 5.0 已经官方支持 opus 格式了,关于 Android 支持的多媒体格式列表可以查看 Android developer guide:《Supported Media Formats》

 

(2) Speex 编解码库

 

老牌的音频处理库,不仅是编解码,还提供了包括音频去噪、回声消除、静音检测等功能,官网地址:http://www.speex.org

 

(3) ffmpeg

 

大名鼎鼎的 ffmpeg 肯定不能错过,官网:https://www.ffmpeg.org

 

(4)Android AAC Encoder

 

一款轻量级的 Android aac 编码库:https://github.com/timsu/android-aac-enc

 

(5)opencore-amr-android

 

从 opencore 抽取出来的 amr 编解码库,地址:https://github.com/kevinho/opencore-amr-android

 

(6)iLBC-Android

 

iLBC 是著名的 WebRTC 项目的音频编解码模块,iLBC-Android 是从中抽取 iLBC 模块移植到 Android 平台的个人项目,地址:https://github.com/lukeweber/iLBC-Android

 

关于第三方编解码库就简单介绍到这里了,最后三个是个人项目,我没有使用过,真心感谢这些作者的无私奉献,另外,更多的第三方库欢迎大家留言或者来信补充。

原文转自:乐搏学院http://www.learnbo.com/front/article/cmsIndex

2020-01-24 21:04:13 Lione10 阅读数 3396

很多人不知道为什么有一些蓝牙耳机连接了小米手机之后为什么在连接了之后不能够正常的使用aac编码 而是默认使用SBC编码

先来说说蓝牙SBC编码和AAC编码有什么不一样

SBC是一种一般的音频格式,蓝牙传输在不支持其他编码格式的时候都会选择SBC传输,音质非常一般,现在大部分耳机都是这种格式的

AAC则是高清传输的音频格式,在你的耳机具备AAC编码格式协议的前提下,手机也支持该蓝牙协议的时候,将会使用该编码进行解码,音质较SBC将是很大的提升,一般人都能区别出来。

在各大国产手机品牌高速发展中,我相信还是有很多人选择小米手机,而小米手机8和小米手机9等都支持AAC编码,那为什么有很多蓝牙耳机明明是支持AAC协议的,但是为什么连接上小米手机之后就默认选择了SBC编码格式,而找到开发者选项中去进行修改也没什么作用,改了还是自动跳回来了。

再回到手机的蓝牙设置
如下图有个AAC选项 我这里有而已 很多人在MIUI10 的后期系统版本和MIUI 11的新版中 是没有这个选项的。
在这里插入图片描述
现在进入正题 如何解决当蓝牙耳机与手机都支持蓝牙AAC协议的时候无法使用AAC编码

如何解决当蓝牙耳机与手机都支持蓝牙AAC协议的时候无法使用AAC编码

1.更改系统 将MIUI10或是新版MIUI11系统统一改成开发版使用卡刷刷入手机

如何刷入系统
首先需要备份手机数据,因为在跨版本的时候可能数据全部清空了。这里建议备份到电脑,用小米助手3.0,一定要用3.0,老版本都使用不了。
刷开发版有两种方式 一种就是去官方申请内测资格 另一种就点击下面进入下载开发版
这里给出下载开发版的链接点击进入MIUI下载
值得一提的是 开发版并不稳定 有许多bug
这里所说的卡刷 就是你把安装包下载到你的内存 然后在更新界面上面点击手动选择安装包(没有该选项的把那个MIUI 的大图标10 连续点击多次则会出现)
在这里插入图片描述
选择之后抹除数据之后就可以了。

不想更换版本的看下面

2.更改蓝牙协议 (ADD 白名单)

这个方法听起来感觉操作很难 但是一旦修改成功之后 连AAC都不用点 连上就默认是AAC

因为在安卓9之后 MIUI推出了蓝牙白名单 也就是官方会测试一批支持ACC协议的耳机 并且将这些设备都加入到白名单中,这种做法是可以理解的,因为就目前的市场来看,做一个白名单比做黑名单简单很多。

当然,更改蓝牙协议肯定是需要获取root权限的 如果不想root的 下面的操作也无法实现了。

如果你本来就是开发版 root就很简单了。如果不想root的话 还是更换版本吧。

这里推荐一个 工具 MT管理器 应用商店直接下载

下载之后打开 就可以进入根目录

这里我直接提供路径 在/system/etc/bluetooth/ 这个路径下 有个文件interop_database.conf
如图
在这里插入图片描述

点击后可进入查看代码
在这里插入图片描述

可以将你的 设备名称 = Name_Based 添加到具体白名单里面 随意插空加入即可

例如 WF-1000XM3 = Name_Based

在这里介绍一下黑名单 如果你的设备有在黑名单下面的话 就删掉他

在这里插入图片描述

在这里插入图片描述

连接成功后将会自动以AAC编码格式解码。

文章到这里结束啦。
这是我第一次发原创博客,以后还会发一些在javaweb后台开发过程中经常出现的bug以及解决的办法 希望大家多多支持!

AAC音频格式简析

阅读数 230