安卓SRC那回事(完整篇) - 知乎

本文原发在微博上,后整理合并在一起,方便大家阅读。


上篇:一夫当关万夫莫开?

二十多年前的初中课堂上,物理老师在黑板上画了一个烤串一样的符号,告诉我们说这叫电阻,对电流有阻碍作用。我可爱的同桌当时就懵了,瞪着眼睛问我,既然有阻碍为什么还要用它呢?是啊,存在就是有它的合理性和价值,包括今天要聊的内容。

安卓系统拥有良好的用户体验和丰富的音乐应用资源,近年来被越来越多的国砖所采用,只不过安卓的音频系统一直被人诟病,从最早的劣质SRC算法,到复杂的软硬件工作系统,确实很难驾驭好,以至于不少评论都认为用安卓就告别好声音。那究竟能不能解决?是否能到达封闭纯音系统的效果?

海贝音乐开发团队曾主导设计了多个安卓平台的音频软硬件架构,也有一些经验,这里先抛开硬件设计等环节,就关注度比较高的SRC问题和大家聊一下。

SRC的由来及安卓平台现状

SRC问题在早期的安卓系统中对声音的影响非常大,伴随着安卓自身的升级,大部分情景已经优化的可以了,有些手机也解决了本地播放的部分SRC问题(手机几乎不能彻底解决,下文会讲到),一般用手机听音乐的用户也可以不用太去深究。但对于追求HiFi,希望得到Bit perfect输出的用户来说,SRC确实是安卓播放器首先要解决的问题。

SRC的全称是Sample Rate Conversion(采样率转换),我们先从Sample Rate(采样率)说起:

采样是指从模拟系统的连续信号到数字系统的离散信号所抽取样本的过程,一定的时间内,抽取的样本越多,对原始信号的描述越准确,所抽取的数据量就越多,也就是采样(频)率越高。

采样图示

由于种种历史原因,数字音频系统存在多个采样率标准,最为广泛的是44.1KHz和48KHz,以及它们的倍数88.2KHz、96KHz、176.4KHz、192KHz……甚至播放器已经支持到高达768KHz的采样率,更有DSD超过11.2M的采样率,给数字音频带来非常大的空间,获得更多音乐细节的同时,可以更加灵活的设计声音模拟电路。

尽管可以有多种音频采样率的存在,但一个硬件数模转换器(DAC)在一个时间只能工作在一个固定的采样频率下,切换不同的采样率的代价很大,最主要的问题就是声音中断并且带来"啪"的冲击声。在开放式的系统中,比如电脑,智能手机,可能会存在多个不同采样率的音源需要同时发出声音,更需要一个固定的采样率来避免声音的中断,这就使得不同的音源全部要转成同样的采样率(即SRC过程)再做混音,然后送到DAC处理。

常见的多音源音频系统结构

这就是SRC为什么会出现,存在即为合理。毕竟这是在当下硬件架构下,可以同时处理多线程音频工作模式的一个方法,同时,这些应用毕竟不是为了追求音质的高保真呈现;

也是基于上述原因,开发者们在电脑上开发出多个绕过系统音频SRC的的驱动,比如Windows上常用的ASIO等。

在安卓手机上,音频系统会更加复杂,要兼顾通话、闹钟、系统通知、蓝牙等非常多的音频通道,无法从最基本的系统给与HiFi特殊的支持。并且由于安卓的的版本分化严重以及厂家的硬件差异大,也很难做好一个独立的通用音频驱动。常见的做法就是通过USB来输出原生的音频,绕过系统的音频架构,USB Audio Player Pro这一应用最早实现,海贝音乐紧随其后,从1.0版本开始就支持安卓的USB Audio的原生输出,也是首款免费播放软件支持USB Audio的,从诞生到现在近四年的时间里从未间断的调试和优化更多第三方设备支持(比如不同品牌或型号的安卓系统手机)。

能看到的是,SRC在手机上的问题已经引起了很多Hi-Fi类播放软件的关注和取得了一定的突破,目前已有很多款应用例如Onkyo HF Player,Neutron Player,PowerAmp等都已支持通过USB Audio输出来绕开安卓的SRC,海贝音乐App也是最早加入USB Audio支持的App之一。这种使用方法可以有效的解决安卓手机连接外部USB解码器的问题,但是对于手机自身的耳机输出却无能为力。

我们经常收到用户的邮件,请我们去支持一个手机、ROM、解码器都不清楚的设备,也正是由于这些需求,海贝音乐在不断的技术积累和突破后,推出了旗下第一款安卓播放器--R6。目前R6用到了海贝音乐第四代的DTA(Direct Transport Audio)技术,也是海贝音乐目前对SRC处理最新最完善的一款播放器,在R6运行其他音乐应用都基本上可以有效解决掉SRC所带的问题。

以上说了这么多,大家可能对安卓有些恨铁不成钢了,这么多年依旧无法处理好SRC这个问题。BUT,这还真不是安!卓!的!锅!What?Are you kidding me?

这还真不能全怪在安卓身上,安卓从很早的版本就已经考虑到这些问题,聪明的设置了一个叫做HAL(Hardware Abstraction Layer,硬件抽象层)的东西,隔离开安卓应用和系统的硬件,并且通过audio_policy.conf这个文件来配置。厂商在定制安卓的时候,基本都是在HAL来修改,包括海贝R6的DTA技术也大多在HAL部分实现。

常见安卓设备的音频架构(针对有线耳机播放音乐场景做简化)

事实上,安卓系统中存在多处SRC:

第一个是App内部的【SRC1】,这个由App自己控制,与安卓没有直接的关系。

第二个是安卓自身的【SRC2】,位于安卓的AudioFlinger里面。大多数的音乐App都是经过了这个SRC。事实上安卓已经准备了一个专门的通道来绕过,但是需要对应的配置和后端支持,例如Poweramp Alpha的HiRes输出就是用的这个通道。

第三个是DSP/驱动层的【SRC3】,这个是平台相关的,和安卓也没有直接的关系。例如高通的芯片就会在DSP里提供这个功能,瑞星微等芯片就没有(因为没有DSP)。

大部份人通常讲的安卓SRC是指【SRC2】。为了减少出问题的概率和提高App的兼容性,手机一般都不会绕过这个SRC。目前只有少数的安卓平台会提供特别的通道(上图橙色箭头)来直连HAL。

接下来我会按照不同的安卓设备来介绍其对SRC的处理情况。

普通安卓手机对于SRC的处理

这个还是要提一下,普通的手机根本不会在意任何的SRC,只是保证各种场景下都能出个声。最常见的处理方式是把【SRC2】的输出统一为48K,这种做法是一种最简单粗暴的方式。甚至包括某些只在后端加个耳放芯片就吹自己是HiFi的手机也是如此。所以,你所有的音乐,除了48K以外,都是被SRC处理过的。在44.1K音源仍占据绝大多数的今天,用这种手机听音乐基本上你听不到真正的声音的。

至于具备HiFi属性的安卓手机和安卓播放器,它们对SRC的处理方式又是怎样?我会在下篇文章里面继续和大家分析。


下篇:条条大路通罗马!

大约8年前,我买了一部带有双离合变速箱的车,它平滑而迅速的起步给我的快感并没有维持多久,便带来了失去动力以及顿挫等严重问题。没错,老司机们可能知道就是那款被央视315曝光的车。自从内燃机汽车被发明以来,工程师们不断的设计出各种性能优异的变速箱,不断提升它的传递效率,但,是否一定要有变速箱呢?来自瑞典的柯尼塞格超跑Regera就大胆的去掉了变速箱,通过KDD直驱把0-400km加速缩短到20秒以内。这样的跑车你是不是做梦都想拥有一台呢?

图1:没有变速箱的柯尼塞格超跑Regera(图片来源于网络)

滴,中关村站到了,该醒了,我们今天的主题依旧是SRC。在上篇文中介绍了SRC的由来以及安卓的音频架构,这次会聊一下没有SRC的超跑,哦不,安卓播放器。(主图来源于汽车之家,有兴趣的可以自行去了解)


我们先看一下安卓HiFi手机对于SRC的处理

我们一般理解为HiFi手机是具备了独立DAC和耳放电路的手机,这相对于传统的手机已经有了很大的变化,所以SRC在HiFi手机上并没有成为关注的焦点。尽管有些HiFi手机可以支持双晶振等外部时钟,但并没有全面解决SRC问题。

大致框图可以简化如下:

图2:安卓HiFi手机常见的音频架构

自带的播放器会使用一个特殊的通道,能够保证不经过【SRC2】,直接送到了DSP。但是【SRC3】就不一定,在没有外部双晶振的情况下也可能会经过【SRC3】把输出固定住一个较高采样率上,比如192K;有双晶振的情况下可以跳过【SRC3】,使用外部DAC提供的采样率(比如ESS等品牌的专业DAC具有时钟输出功能)。

对于第三方App则没有这么幸运了,依旧通过【SRC2】,统一变成48K,还有可能通过【SRC3】再次改变采样!Oh no!心疼一下你们的网易云音乐。

图3:无辜的网易云音乐


普通安卓播放器对于SRC的处理

按照架构上来区分,大概可以分成两类:

第一类是分离型。 可以理解为一个安卓前端和一个USB解码器的结合体,在内部通过USB连接。

图4:分离型的安卓播放器音频架构

如图4,虚线左侧为标准安卓前端,右侧为USB解码器。

这样做的好处是第三方的支持USB输出的 App可以直接绕过安卓系统,输出到USB接口上,和外接USB解码器的使用方式相同。这种情况下是否有SRC取决于USB App本身。

自带播放器也等于使用了特殊通道,无SRC。第三方不支持USB输出的App依旧经过【SRC2】,再次心疼一下你们的网易云音乐。

第二类是一体型。 这种是比较常规的做法,不过对安卓系统的改动会大一些。

图5:一体型的安卓播放器音频架构

这种类型其实和HiFi手机的处理方式类似,只不过多了专用的FPGA来做时钟管理,提供更高的采样率包括DSD的原生支持,也不会存在【SRC3】(见图5),其他的处理流程上差不多。

海贝音乐的第二代和第三代去SRC技术就是这种一体型的。

在以上两种类型中,都可以通过对HAL的配置来避开【SRC2】对44.1采样率的转换,也就是说在这种情况下第三方播放器仅在播放44.1时可以绕过【SRC2】。

另外还有一些其他原因的SRC,比如在早期的播放器上使用ESS90x8系列芯片的时候会遇到工作时钟的问题,导致会把352.8K/384K降低到176.4K/192K来播放。


第四代去SRC技术DTA的全新应用--HiBy R6安卓播放器对于SRC的处理

上篇提到,HiBy R6安卓播放器使用的DTA属于我们的第四代去SRC技术,也是全新设计的一个架构:

图6:HiBy R6使用的DTA架构

由图6可以看出,HiBy R6已经完全避开了【SRC2】,任何第三方音乐App都享有和自带播放器同样的权利,建立一个轨对轨的通道至HAL,可以直接输出所有支持的采样率(最高至384K或者DSD256),由HAL做智能通路选择再输出到FPGA。同时,这样的方式也会绕开安卓所有的音频后处理过程,包括EQ、混响、混音等,所以任何第三方的音效插件也不会起作用,等同于安卓的一个ASIO模式。

第三方App要做的事情就是不做任何处理,直接按照标准输出就可以。所以即使很古老的App,也可以实现无SRC输出。

图7:状态栏显示实时输出采样率

为了更直观的了解输出状态,R6在状态栏上增加了实时的采样率显示,也可以帮您检验第三方App是否有【SRC1】存在。【SRC1】的去除只能依靠对应App自身去解决,比如QQ音乐在内部会把高于48K的降低为44.1K或者48K,后面有我们针对【SRC1】做专门测试的表格。

另外,我们还在R6上为HAL增加了高精度的浮点格式音频输入接口,例如jet Audio Plus可以直接开启HRA模式输出32位浮点格式音频。

经过我们测试,网易云音乐可以较好的按原生采样率输出,习惯网易云音乐的烧友们可以放心的使用。

海贝音乐安卓平台去SRC技术的发展

第三方音乐App对SRC的兼容性

经过我们在R6上测试,音乐类的App大致可以分为三类:

第一类是直接型,一般不做任何处理的(比如192K以内),直接输出给系统,比如网易云音乐的新版本。

第二类是普通型,为了兼容性考虑,会在APP内设置【SRC1】,比如QQ音乐,酷我音乐。

第三类是专业型,会提供非常详细的输出设置,比如Poweramp alpha。

直接型的对系统的依赖性比较高,全靠系统来处理,在不同的设备上差异会很大。普通型的对系统的依赖性低,可以很好的兼容各种设备,但是无法提供更高的性能。专业型的可以通过不同的配置做灵活选择,适合有一定基础的用户使用。

常见音乐App在HiBy R6上的SRC状况

最后希望通过这两篇文,让烧友们对安卓的SRC有个更加深入的了解,根据自己的使用习惯,选择合适的设备和App,也希望能对播放器行业的从业者们起到抛砖引玉的作用。

posted @ 2022-12-01 15:36  lingr7  阅读(5956)  评论(0编辑  收藏  举报