Android音频基础知识V19.docx

上传人:b****8 文档编号:11462482 上传时间:2023-03-01 格式:DOCX 页数:13 大小:934.97KB
下载 相关 举报
Android音频基础知识V19.docx_第1页
第1页 / 共13页
Android音频基础知识V19.docx_第2页
第2页 / 共13页
Android音频基础知识V19.docx_第3页
第3页 / 共13页
Android音频基础知识V19.docx_第4页
第4页 / 共13页
Android音频基础知识V19.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Android音频基础知识V19.docx

《Android音频基础知识V19.docx》由会员分享,可在线阅读,更多相关《Android音频基础知识V19.docx(13页珍藏版)》请在冰豆网上搜索。

Android音频基础知识V19.docx

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在这方面出现的兼容性问题就比较多。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1