1、Android音频基础知识V19Android音频基础知识肖荣权 2021.03.18基于篇幅原因,此文档只介绍了下述部分内容:常见基本参数各场景音频输出数据流路径各场景音频输入数据流路径Android系统音量设置有关节点时间戳及AVSYNCAudioFocus音频指人耳可以听到的声音频率在20Hz20kHz之间的声波,高保真系统会处理10Hz90KHz的音频,通常SOC主芯片和PA功放芯片的音频后处理post-processing会对此范围的音频做带通滤波。常见基本参数包括:采样频率sample rate指每秒钟取得声音样本的次数。采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同
2、时占的资源也多,尤其是存储和计算方面的资源。通常声音回放的采样率取44.1KHz或者48KHz,某些HiFi高保真系统会上到96KHz,大部分Android系统的vendor hal native sample rate是48KHz。录音的采样率主要由app根据实际场景自己选择,比如录制music之类的一般选择44.1KHz或者48KHz,人声对话选择8KHz或者16KHz就足够。采样位数sample bit-depth采样值,用来衡量样本量化的动态范围。也可理解为采样分辨率,位数越大越精细,声音的细节表现力就越强,同时在计算过程中精度丢失越少。通常媒体文件、声音回放源数据使用16bit有符号
3、整数或者32bit signed float表示,一些中间处理过程的计算可能会采用20bit signed int、24bit signed int、32bit signed float数,以防止计算过程中丢失精度。通道数channel count声音通道的数目,常见的为单声道Mono、立体声Stereo、3.1ch、3.1.2ch、5.1ch、7.1ch,带宽大的音频系统能处理到32个声道。帧大小frame size单个音频采样的数据大小,也是计算过程能够处理的最小单元。frame_size = sample_bits * channel_count16bits * 2ch = 32 bit
4、s帧块frame block一定数量的帧序列。对vendor hal层以下的libtinyalsa、card driver和hardware DMA操作来说,以帧块作为单次处理的数据单元,通常以能够回放10ms20ms的时间所需要的数据作为帧块大小。frame_block_size = 20ms/1000ms * 48K * frame_size = 960 * frames = 960 * 4B = 3840 B对于一些要求low latency的场合来说,通常以5ms作为帧块大小,frame_block_size = 5ms/1000ms * 48K * frame_size = 240
5、* frames = 240 * 4B = 960 B从libtinyalsa往下传递数据参数时都应当是帧块大小的整数倍。各场景音频输出数据流路径Speaker输出,PCM format数据流Speaker输出,compressed format数据流Speaker输出,语音通话Type-C耳机输出,PCM format数据流Type-C耳机输出,compressed format数据流Type-C耳机输出,语音通话BT耳机输出,PCM format数据流BT耳机输出,compressed format数据流BT耳机输出,语音通话各场景音频输入数据流路径built-in MIC输入Type-C
6、 MIC输入BT SCO HFP MIC输入BT A2DP MIC输入Android系统音量设置有关节点:用dB表示的数字相对音量幅度为-0dB,对应PCM_S16的032767/-32768,对应PCM_S32F的01.0。volume factor范围01.0,dB数与之换算关系: volume_db = 20log(volume_factor)输出音量类别:AudioFlinger Master VolumeAudioFlinger模块主音量STREAM_TYPE Volume按流类型区分的音量AudioTrack VolumeAudioTrack单独的音量,分L R声道AudioTra
7、ck VolumeShaperAudioTrack单独的音量整形器音量AudioDecoder gain音频解码器增益AudioEncoder gain音频编码器增益QC各音频处理模块音量比如PCM模块、VoiceCall模块、Compressed模块、Passthrough模块、VOIP模块、MMAP AudioOut模块QC audio post-processing各级处理的gain比如DRC(动态范围控制)的影响、Out Volume(输出音量)影响、EchoCanceller(消回声)等PA功放芯片Volume及后处理gainPA芯片带Volume调节,通常还含有dsp处理,还有其它
8、各级音频后处理gain。Type-C耳机Volume通常设定为最大1.0蓝牙耳机Volume由phone根据情况通过BT HFP、AVRCP协议设定AudioTrack offload mode音量以offload mode工作的AudioTrack由vendor audio hal层级调节音量最终的音量为数据流路径上的各volume factor相乘。AudioFlinger Master Volume通常情况下是最大音量1.0,特定条件下是mute状态。STREAM_TYPE流类型音量每个AudioTrack指定一种stream type,系统有多个stream type,常见的有STRE
9、AM_VOICE_CALL、STREAM_RING、STREAM_MUSIC、STREAM_ALARM。部分STREAM TYPE会映射到其它,比如STREAM_NOTIFICATION会映射到STREAM_RING。每个stream type在AudioService层级有单独的音量范围比如015和音量值,在call到AudioPolicyManager层级会转换成0100范围,在AudioFlinger层级再映射成01.0之间的浮点系数,从而在AudioFlinger做mix时修改PCM数据。常规电话的语音通话声音数据因为不经过AudioFlinger,所以是另外的流程:上图中的“G db
10、”是AudioTrack的final volume。AudioTrack Volume每个Track有其单独的L/R Volume。常规PCM Track情况下,AudioFlinger做mix时会计算这个音量系数,影响输出的PCM数据。AudioTrack VolumeShaperVolumeShaper的作用是通过渐进式的gain变化来使声音输出的大小做平滑变化,防止声音大的突变带来的不适感,其值随着时间或者是已消耗的音频数据量而变化,主要用在MediaPlayer场景,也是Netflix之类测试认证必过的测试项目。常规PCM Track情况下,AudioFlinger做mix时会计算这个
11、音量系数,影响输出的PCM数据。AudioDecoder gain、AudioEncoder gain、QC各音频处理模块音量、QC audio post-processing各级处理的gain通常software encoder/decoder不会改变输入数据的gain。QC的hw encoder/decoder、各音频处理模块和audio post-processing各级可以调节相应gain,tool sw为QACT,使用的参数配置文件在/vendor/etc/acdbdata/QRD/PA功放芯片Volume及后处理gainchip vendor会提供tuning tool sw调整参
12、数,使用时的参数保存在/vendor/firmware/aw881xx_pid*.bin。Type-C耳机情况:通常传输PCM数据,因此volume都由phone端调节,耳机端固定一个值(比如最大1.0)。蓝牙耳机情况:(1)蓝牙耳机不支持absolute volume绝对音量设置时,基本上与图F1、F2情况差不多。(2)蓝牙耳机支持absolute volume绝对音量设置时(这是目前绝大部分耳机的情况),常规非通话情况下, AudioService将STREAM_TYPE音量调至max,然后通过蓝牙AVRCP协议告诉蓝牙设置到相对音量(范围0127),此时由于音量处理在耳机,所以在耳机端就
13、不方便按STREAM_TYPE来区分音量了,所以通常以STREAM_MUSIC设置蓝牙耳机音量。在语音通话情况下,由于蓝牙耳机已经做了音量控制,因此AudioPolicyManager需要将qc voice volume设置到最大(1.0)。AudioTrack offload mode音量此mode下的audio data不是PCM格式而是压缩的数据,AudioFlinger没法改变其数据达到调节gain的目的,这种track不会实际参与AudioFlinger的mix,而是直接mOutput-stream-setVolume输出到qc vendor hal的stream,发到adsp去解码
14、,因此音量实际是调节的qc adsp的audio decoder的gain,传递的volume = master_vol * stream_vol * track_vol * track_mute。基于package的声音mute控制除了对每个STREAM、TRACK的声音mute控制外,还能控制一个package创建的Track是否能出声,AudioFlinger在处理volume和mix的环节会track-isPlaybackRestricted()判断,如果禁止发声,会吧volume设置到0。AudioService通过AppOpsManager setRestriction来设置,ap
15、p Settings在设置系统勿扰模式的具体rule时会调到。输入音量类别:built-in MIC gain内建MIC输入增益Voice模块gainVoice语音通话输入处理模块引入的gain,输入数据通常都是压缩编码数据,涉及解码引入gain。Audio Decoder gaindecoder处理过程引入的gain,voice-call输入、bt蓝牙mic输入通常都是压缩编码数据,涉及解码引入gain。Type-C耳机MIC gainType-C耳机MIC输入gain蓝牙耳机MIC gain蓝牙耳机MIC输入gain这些参数通常不需要动态改变,初始固定一个合适的值就好,因此android也
16、没有提供相应API接口。built-in MIC gain、Voice模块gain和Audio Decoder gain均固化在QC QACT参数里。Type-C耳机MIC gain可通过alsa mixer ctl接口去设置蓝牙耳机MIC gain可通过BT HFP协议调节蓝牙耳机MIC gain。时间戳及AVSYNCAudio timestamp实际放出声音时的相对时间,即built-in speaker、Type-C耳机、BT耳机处,等于已消耗数据量+末端固定硬件latency时间。此PTS作为媒体播放AVSync的同步基准,系统播放器和第三方app播放器皆使用。# 常规情况AudioT
17、rack: getTimestamp - AudioFlinger:Track: getTimestamp - AudioFlinger:Playback,DirectOuputThread: getTimestamp - out-stream.get_presentation_position qc hal: out_get_presentation_position - lib alsa/compress - qc kernel driver - qc adsp# Type-C耳机# BT蓝牙耳机tunnel mode HW_AV_SYNC硬件AVSync功能QC没有实现,估计手机并不需要
18、严格的AVSync功能,在TV上是强制的。AudioFocus多个声音同时存在时,很难清晰分辨,所以大部分时候只需要有一路声音存在,Android为了统一管理而设计了音频焦点的框架。特性及常见使用状况:-以package为基本单位,不同的请求以stack形式记录,处于stack top的package获得focus,同一个package重复请求时会先删除之前的记录再放于top位置。-来电铃声、呼叫、语音通话app一般会使用flag AUDIOFOCUS_FLAG_LOCK来阻止其它app获得focus。-对声音的实际控制:(1)app请求AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK类型的focus时,system_server才会尝试把其它package的声音降低,比如NotificationPlayer,但是只能控制基于android播放器框架的播放器的声音,对于不是基于播放器架构的播放器(比如绝大部分第三方播放器)和非播放器播放的声音(比如纯粹使用AudioTrack的情形)就不能控制了,所以大部分时候此种方法并没有被app使用。(2)除了上述(1)的情况外,其它情形的声音降低或者暂停播放等操作需要由lost focus的app自己处理。因此第三方app在这方面出现的兼容性问题就比较多。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1