Android音频基础知识V19.docx
- 文档编号:6307221
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:13
- 大小:934.97KB
Android音频基础知识V19.docx
《Android音频基础知识V19.docx》由会员分享,可在线阅读,更多相关《Android音频基础知识V19.docx(13页珍藏版)》请在冰点文库上搜索。
Android音频基础知识V19
Android音频基础知识
肖荣权2021.03.18
基于篇幅原因,此文档只介绍了下述部分内容:
常见基本参数
各场景音频输出数据流路径
各场景音频输入数据流路径
Android系统音量设置有关节点
时间戳及AVSYNC
AudioFocus
音频指人耳可以听到的声音频率在20Hz~20kHz之间的声波,高保真系统会处理10Hz~90KHz的音频,通常SOC主芯片和PA功放芯片的音频后处理post-processing会对此范围的音频做带通滤波。
常见基本参数包括:
●采样频率samplerate
指每秒钟取得声音样本的次数。
采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时占的资源也多,尤其是存储和计算方面的资源。
通常声音回放的采样率取44.1KHz或者48KHz,某些HiFi高保真系统会上到96KHz,大部分Android系统的vendorhalnativesamplerate是48KHz。
录音的采样率主要由app根据实际场景自己选择,比如录制music之类的一般选择44.1KHz或者48KHz,人声对话选择8KHz或者16KHz就足够。
●采样位数samplebit-depth
采样值,用来衡量样本量化的动态范围。
也可理解为采样分辨率,位数越大越精细,声音的细节表现力就越强,同时在计算过程中精度丢失越少。
通常媒体文件、声音回放源数据使用16bit有符号整数或者32bitsignedfloat表示,一些中间处理过程的计算可能会采用20bitsignedint、24bitsignedint、32bitsignedfloat数,以防止计算过程中丢失精度。
●通道数channelcount
声音通道的数目,常见的为单声道Mono、立体声Stereo、3.1ch、3.1.2ch、5.1ch、7.1ch,带宽大的音频系统能处理到32个声道。
●帧大小framesize
单个音频采样的数据大小,也是计算过程能够处理的最小单元。
frame_size=sample_bits*channel_count
16bits*2ch=32bits
●帧块frameblock
一定数量的帧序列。
对vendorhal层以下的libtinyalsa、carddriver和hardwareDMA操作来说,以帧块作为单次处理的数据单元,通常以能够回放10ms~20ms的时间所需要的数据作为帧块大小。
frame_block_size=20ms/1000ms*48K*frame_size=960*frames=960*4B=3840B
对于一些要求lowlatency的场合来说,通常以5ms作为帧块大小,
frame_block_size=5ms/1000ms*48K*frame_size=240*frames=240*4B=960B
从libtinyalsa往下传递数据参数时都应当是帧块大小的整数倍。
各场景音频输出数据流路径
●Speaker输出,PCMformat数据流
●Speaker输出,compressedformat数据流
●Speaker输出,语音通话
●Type-C耳机输出,PCMformat数据流
●Type-C耳机输出,compressedformat数据流
●Type-C耳机输出,语音通话
●BT耳机输出,PCMformat数据流
●BT耳机输出,compressedformat数据流
●BT耳机输出,语音通话
各场景音频输入数据流路径
●built-inMIC输入
●Type-CMIC输入
●BTSCOHFPMIC输入
●BTA2DPMIC输入
Android系统音量设置有关节点:
用dB表示的数字相对音量幅度为-∞~0dB,对应PCM_S16的0~32767/-32768,对应PCM_S32F的0~±1.0。
volumefactor范围0~1.0,dB数与之换算关系:
volume_db=20log(volume_factor)
输出音量类别:
AudioFlingerMasterVolume
AudioFlinger模块主音量
STREAM_TYPEVolume
按流类型区分的音量
AudioTrackVolume
AudioTrack单独的音量,分LR声道
AudioTrackVolumeShaper
AudioTrack单独的音量整形器音量
AudioDecodergain
音频解码器增益
AudioEncodergain
音频编码器增益
QC各音频处理模块音量
比如PCM模块、VoiceCall模块、Compressed模块、Passthrough模块、VOIP模块、MMAPAudioOut模块
QCaudiopost-processing各级处理的gain
比如DRC(动态范围控制)的影响、OutVolume(输出音量)影响、EchoCanceller(消回声)等
PA功放芯片Volume及后处理gain
PA芯片带Volume调节,通常还含有dsp处理,还有其它各级音频后处理gain。
Type-C耳机Volume
通常设定为最大1.0
蓝牙耳机Volume
由phone根据情况通过BTHFP、AVRCP协议设定
AudioTrackoffloadmode音量
以offloadmode工作的AudioTrack由vendoraudiohal层级调节音量
最终的音量为数据流路径上的各volumefactor相乘。
●AudioFlingerMasterVolume
通常情况下是最大音量1.0,特定条件下是mute状态。
●STREAM_TYPE流类型音量
每个AudioTrack指定一种streamtype,系统有多个streamtype,常见的有STREAM_VOICE_CALL、STREAM_RING、STREAM_MUSIC、STREAM_ALARM。
部分STREAMTYPE会映射到其它,比如STREAM_NOTIFICATION会映射到STREAM_RING。
每个streamtype在AudioService层级有单独的音量范围比如0~15和音量值,在call到AudioPolicyManager层级会转换成0~100范围,在AudioFlinger层级再映射成0~1.0之间的浮点系数,从而在AudioFlinger做mix时修改PCM数据。
常规电话的语音通话声音数据因为不经过AudioFlinger,所以是另外的流程:
上图中的“Gdb”是AudioTrack的finalvolume。
●AudioTrackVolume
每个Track有其单独的L/RVolume。
常规PCMTrack情况下,AudioFlinger做mix时会计算这个音量系数,影响输出的PCM数据。
●AudioTrackVolumeShaper
VolumeShaper的作用是通过渐进式的gain变化来使声音输出的大小做平滑变化,防止声音大的突变带来的不适感,其值随着时间或者是已消耗的音频数据量而变化,主要用在MediaPlayer场景,也是Netflix之类测试认证必过的测试项目。
常规PCMTrack情况下,AudioFlinger做mix时会计算这个音量系数,影响输出的PCM数据。
●AudioDecodergain、AudioEncodergain、QC各音频处理模块音量、QCaudiopost-processing各级处理的gain
通常softwareencoder/decoder不会改变输入数据的gain。
QC的hwencoder/decoder、各音频处理模块和audiopost-processing各级可以调节相应gain,toolsw为QACT,使用的参数配置文件在
/vendor/etc/acdbdata/QRD/
●PA功放芯片Volume及后处理gain
chipvendor会提供tuningtoolsw调整参数,使用时的参数保存在/vendor/firmware/aw881xx_pid*.bin。
●Type-C耳机情况:
通常传输PCM数据,因此volume都由phone端调节,耳机端固定一个值(比如最大1.0)。
●蓝牙耳机情况:
(1)蓝牙耳机不支持absolutevolume绝对音量设置时,基本上与图F1、F2情况差不多。
(2)蓝牙耳机支持absolutevolume绝对音量设置时(这是目前绝大部分耳机的情况),常规非通话情况下,AudioService将STREAM_TYPE音量调至max,然后通过蓝牙AVRCP协议告诉蓝牙设置到相对音量(范围0~127),此时由于音量处理在耳机,所以在耳机端就不方便按STREAM_TYPE来区分音量了,所以通常以STREAM_MUSIC设置蓝牙耳机音量。
在语音通话情况下,由于蓝牙耳机已经做了音量控制,因此AudioPolicyManager需要将qcvoicevolume设置到最大(1.0)。
●AudioTrackoffloadmode音量
此mode下的audiodata不是PCM格式而是压缩的数据,AudioFlinger没法改变其数据达到调节gain的目的,这种track不会实际参与AudioFlinger的mix,而是直接mOutput->stream->setVolume输出到qcvendorhal的stream,发到adsp去解码,因此音量实际是调节的qcadsp的audiodecoder的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通过AppOpsManagersetRestriction来设置,appSettings在设置系统勿扰模式的具体rule时会调到。
输入音量类别:
built-inMICgain
内建MIC输入增益
Voice模块gain
Voice语音通话输入处理模块引入的gain,输入数据通常都是压缩编码数据,涉及解码引入gain。
AudioDecodergain
decoder处理过程引入的gain,voice-call输入、bt蓝牙mic输入通常都是压缩编码数据,涉及解码引入gain。
Type-C耳机MICgain
Type-C耳机MIC输入gain
蓝牙耳机MICgain
蓝牙耳机MIC输入gain
这些参数通常不需要动态改变,初始固定一个合适的值就好,因此android也没有提供相应API接口。
built-inMICgain、Voice模块gain和AudioDecodergain均固化在QCQACT参数里。
●Type-C耳机MICgain
可通过alsamixerctl接口去设置
●蓝牙耳机MICgain
可通过BTHFP协议调节蓝牙耳机MICgain。
时间戳及AVSYNC
●Audiotimestamp
实际放出声音时的相对时间,即built-inspeaker、Type-C耳机、BT耳机处,等于已消耗数据量+末端固定硬件latency时间。
此PTS作为媒体播放AVSync的同步基准,系统播放器和第三方app播放器皆使用。
#常规情况
AudioTrack:
:
getTimestamp->AudioFlinger:
:
Track:
:
getTimestamp->AudioFlinger:
[Playback,DirectOuput]Thread:
:
getTimestamp->out->stream.get_presentation_position–>qchal:
:
out_get_presentation_position->libalsa/compress->qckerneldriver->qcadsp
#Type-C耳机
#BT蓝牙耳机
●tunnelmodeHW_AV_SYNC硬件AVSync功能
QC没有实现,估计手机并不需要严格的AVSync功能,在TV上是强制的。
AudioFocus
多个声音同时存在时,很难清晰分辨,所以大部分时候只需要有一路声音存在,Android为了统一管理而设计了音频焦点的框架。
特性及常见使用状况:
-以package为基本单位,不同的请求以stack形式记录,处于stacktop的package获得focus,同一个package重复请求时会先删除之前的记录再放于top位置。
-来电铃声、呼叫、语音通话app一般会使用flagAUDIOFOCUS_FLAG_LOCK来阻止其它app获得focus。
-对声音的实际控制:
(1)app请求AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK类型的focus时,system_server才会尝试把其它package的声音降低,比如NotificationPlayer,但是只能控制基于android播放器框架的播放器的声音,对于不是基于播放器架构的播放器(比如绝大部分第三方播放器)和非播放器播放的声音(比如纯粹使用AudioTrack的情形)就不能控制了,所以大部分时候此种方法并没有被app使用。
(2)除了上述
(1)的情况外,其它情形的声音降低或者暂停播放等操作需要由lostfocus的app自己处理。
因此第三方app在这方面出现的兼容性问题就比较多。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 音频 基础知识 V19