精华内容
下载资源
问答
  • android音频
    千次阅读
    2022-02-15 15:01:51

            研究Android的音频子系统必须要了解Android所使用的的术语,本词汇表收录了与音频相关的术语,其中包括广泛使用的通用术语和 Android 专用术语,主要翻译自Android技术网站。

    1 通用术语

    与音频相关的通用术语的含义都采用其约定俗成的解释。

    1.1 Digital Audio(数字音频)

    数字音频术语涉及使用以数字格式编码的音频信号处理声音。

    数字音频是以数字形式记录或转换为数字形式声音表示。在数字音频中,声波的的音频信号通常被编码为数字样本中的连续序列。

    AC3

    一种Dolby的编解码器。AC3(全称Audio Coding3音频编码3)是杜比数码的同义词,杜比数码是一种高级音频压缩技术,它最多可以对6个比特率最高为448kbps的单独声道进行编码。

    杜比AC-3提供的环绕声系统由5个全频域声道和1个超低音声道组成,被称为5.1声道。5个声道包括左前、中央、右前、左后、右后。低音声道主要提供一些额外的低音信息,使一些场景,如爆炸、撞击等声音效果更好。

    acoustics(声学)

    对声音的机械属性的研究,例如换能器(音响设备、麦克风等)在设备中的物理位置如何影响听者感知到的音频质量。

    attenuation(衰减)

    小于或等于 1.0 的乘法因数,应用于音频信号以降低信号电平。与“增益”对应。.

    audiophile(音乐发烧友)

    追求极致音乐欣赏体验的人,尤其是愿意为音质而在其他方面(花费、组件大小和房间设计等)做出巨大让步的人。

    AVB(Audio Video Bridging,音频视频桥接)

    音频视频桥接(AVB) 是一组技术标准的通用名称,为交换 以太网提供改进的同步、低延迟和可靠性。.音频视频桥接是作为交换以太网网络实现的,它通过为 AV 流量保留一部分可用以太网来工作。

    bits per sample or bit depth(每样本位数或位深)

    每个样本的信息位数。.

    channel(声道)

    单个音频信息流,通常与一个录音位置或播放位置相对应。

    downmixing(缩混)

    减少声道的数量,例如从立体声到单声道或从 5.1 到立体声。缩混通过减少声道、混合声道或更高级的信号处理技术来实现。如果简单地混合声道而不进行衰减或加以限制,则可能会出现溢出或削波的情况。与“扩混”对应.

    DSD(Direct Stream Digital,直接数字流)

    基于脉冲密度调制的专有音频编码技术。脉冲编码调制 (PCM) 可将波形编码为多位的个体音频样本序列,而 DSD 可以非常高的采样率将波形编码为位数序列(不涉及样本这一概念)。 PCM 和 DSD 均代表按独立序列划分的多个声道。由于我们很难将传统的数字信号处理 (DSP) 算法应用于 DSD,因此 DSD 更适合内容分发,而不适合作为内部表示法处理。DSD 用于超音频 CD (SACD) 以及针对 USB 的 DoP (DSD over PCM)。如需了解详情,请参阅直接数字流

    duck(回避)

    当另一个音频流变得活跃时,暂时降低音频流的音量。 例如,如果播放音乐时收到一条通知,则音乐会在通知播放时闪避。与“静音”对应。

    FIFO(First In, First Out,先进先出)

    。用于实现数据队列先进先出的硬件模块或软件数据结构。谈到音频时,存储在队列中的数据通常是音频帧。FIFO 可通过环形缓冲区来实现。

    frame(帧)

    某个时间点上的样本集,每个声道对应一个样本

    frames per buffer(每缓冲区帧数)

    同时从一个模块传递到另一个模块的帧数。音频 HAL 接口会使用每缓冲区帧数这一概念。

    gain(增益)

    大于或等于 1.0 的乘法因数,应用于音频信号以提高信号电平。与“衰减”对应。

    HD audio(High-Definition audio ,HD 音频)

    高清晰度音频。高解析度音频的同义词(但与 Intel 高清晰度音频不同)。

    headphones(耳机)

    是指戴在头上的双耳耳机,或者叫做头戴式耳机

    又称耳筒或听筒,是一对转换单元,它接受媒体播放器或接收器所发出的电讯号,利用贴近耳朵的扬声器将其转化成可以听到的音波。耳机一般是与媒体播放器可分离的,利用一个插头连接。好处是在不影响旁人的情况下,可独自聆听音响;亦可隔开周围环境的声响,对在录音室、DJ、旅途、运动等在噪吵环境下使用的人很有帮助(封闭式耳机)。

    耳机原是给电话和无线电上使用的,但随着便携式电子装置的盛行,耳机多用于手机、随身听、收音机、便携式电玩和数位音讯播放器等,亦同时见用于电脑和 Hi-fi 音响之中

    headset(耳麦)

    耳麦是耳机与麦克风的整合体,它不同于普通的耳机。普通耳机往往是立体声的,而耳麦多是单声道的,同时,耳麦有普通耳机所没有的麦克风。耳麦分为无线耳麦和有线耳麦。这两种耳麦有各自的特点。.

    Hz(赫兹)

    采样率或帧率的单位。

    high-resolution audio(高解析度音频)

    与 CD(立体声 16 位 PCM,44.1 kHz)相比,位深和采样率更高的一种音频数据表示方式,且支持无损数据压缩。相当于 HD 音频。

    interleaved

    A representation for multi-channel digital audio that alternates data among channels. For example, stereo digital audio expressed in interleaved format is left, right, left, right, etc.

    latency(延时)

    信号通过系统时的延迟时间。

    lossless(无损)

    可在编码和解码的过程中保持位精度的无损数据压缩算法;使用这种算法时,如果对之前编码的数据进行解码,得到的结果与原始数据相当。无损音频内容分发格式的示例包括 CDWAV 中的 PCM,以及 FLAC 等。制作过程可能会导致位深或采样率相较于母版有所下降;可保持母版的解析度和位精确度的分发格式属于高解析度音频的范畴。

    lossy(有损)

    尝试在编码和解码的过程中保留最重要媒体特征的有损数据压缩算法;使用这种算法时,如果对之前编码的数据进行解码,得到的结果与原始数据看似相似,但并不完全相同。使用有损音频压缩算法的格式包括 MP3 和 AAC 等。由于模拟值属于连续的域,而数字值是离散的,因此就振幅而言,ADC 和 DAC 属于有损转换。.

    mono(单声道)

    一个声道。

    multichannel(多声道)

    多个声道的音频,严格来讲,“立体声”也指多个声道,可以视为多声道;不过,由于这种用法容易产生混淆,因此请避免使用。

    mute(静音)

    暂时强制将音量降为 0;独立于通常使用的音量控件。

    overrun(溢出)

    未能在一定的时间内接受提供的数据而导致的听得到的短时脉冲波干扰。如需了解详情,请参阅缓冲区欠载。与“欠载”对应。

    panning(平移)

    将一个信号移至立体声或多声道音场中的相应位置。

    PCM(脉冲编码调制)。

    最常见的低级别数字音频编码形式。以有规律的间隔对音频信号取样(称为采样率),然后根据位深对特定范围内的离散值进行量化。例如,对于 16 位 PCM,样本值是介于 -32768 到 +32767 之间的整数值。

    ramp(斜坡)

    逐渐提高或降低特定音频参数(如音量或某种音效的强度)的级别。音量斜坡一般用于暂停和继续播放音乐,以免出现听得到的生硬过渡。

    sample(样本)

    代表某个时间点上一个声道的音频值的数字。

    sample rate or frame rate(采样率或帧率)

    每秒帧数。“帧率”这一用法更为准确,但业内习惯使用“采样率”来表示帧率。

    sonification(可听化)

    使用声音表达反馈或信息,例如触摸音效和键盘音效。

    SPL

    Sound Pressure Level, a relative measurement of sound pressure.

    stereo(立体声)

    两个声道

    stereo widening(立体声展宽)

    应用于立体声信号的一种音效,能使另一立体声信号听起来更饱满丰富。该音效也可应用于单声道信号;在单声道信号中,它属于扩混。

    surround sound(环绕声)

    增强听众感知声音位置(不仅仅是立体声的左右声道)的能力的技术。

    transparency(透明度)

    有损数据压缩的理想效果。如果人类主体从感觉上无法区分原始音频和压缩结果,则表示有损数据转换是透明的。

    underrun(欠载)

    未能在一定的时间内提供所需数据而导致的听得到的短时脉冲波干扰

    upmixing(扩混)

    增加声道的数量,例如从单声道到立体声或从立体声到环绕声。扩混通过复制、平移或更高级的信号处理技术来实现。与“缩混”对应。

    USAC

    An audio codec for low bit-rate applications. For details, refer to Unified Speech and Audio Coding.

    virtualizer(虚拟音效)

    尝试使音频声道空间化的音效,例如,尝试模拟更多扬声器,或给人一种声音来自某个位置的错觉。

    volume(音量)

    响度,音频信号的主观强度。

    1.2 Inter-device interconnect(设备间互连)

    设备间互连技术用于将各设备的音频和视频组件连接起来,用户可通过外部连接器从视觉上直观感受到这些技术。HAL 实现人员和最终用户应了解以下术语。.

    Bluetooth(蓝牙)

    近距离无线技术。要详细了解与音频相关的蓝牙规范蓝牙协议,请参阅 A2DP 来了解音乐方面的信息,参阅 SCO 来了解电话方面的信息;另外还可以参阅音频/视频远程控制规范 (AVRCP)

    DisplayPort

    视频电子标准协会 (VESA) 制订的数字显示接口。

    dongle(外接小配件)

    外接小配件是一种小工具,特指可直接插入到其他设备上的小工具。

    FireWire

    See IEEE 1394.

    HDMI

    高清晰度多媒体接口,用于传输音频和视频数据。移动设备上会使用微型 HDMI(D 型)或 MHL 连接器。

    IEEE 1394

    IEEE 1394(也称为 FireWire)是一种用于实时低延迟应用(如音频)的串行总线。

    Intel HDA

    Intel 高清晰度音频(请不要与泛指的“高清晰度音频”或“高解析度音频”混淆);一种前面板连接器规范。如需了解详情,请参阅 Intel 高清晰度音频

    interface(接口)

    接口可将信号从一种表现形式转换为另一种。常见的接口包括 USB 音频接口和 MIDI 接口。

    line level(线路电平)

    线路电平是指在不同音频组件(而非换能器)之间传输的模拟音频信号的强度。

    MHL

    移动高清连接技术。一种移动音频/视频接口,通常通过 micro-USB 连接器进行数据传输。

    phone connector(手机连接器)

    连接设备和有线头戴式耳机、耳麦或线路电平放大器的小型或超小型组件。

    SlimPort

    micro-USB 转 HDMI 的适配器。

    S/PDIF(Sony/Philips Digital Interface Format. Sony/Philips 数字接口格式)

    用于未压缩的 PCM 音频的互连。如需了解详情,请参阅 S/PDIF。S/PDIF 是 AES3 的消费级版本。

    Thunderbolt

    与 USB 和 HDMI 竞争的一种多媒体接口,用于连接高端外围设备。如需了解详情,请参阅 Thunderbolt

    TOSLINK

    TOSLINK 是一种配合 S/PDIF 使用的光纤音频数据线。

    USB

    通用串行总线。.

    1.3 Intra-device interconnect(设备内互连)

    设备内互连技术用于将一台设备内的不同音频组件连接起来,如果不拆开设备,则无法从视觉上直观感受到这些技术。HAL 实现人员可能需要了解以下术语,但最终用户不需要。

    • I²C, 用于控制声道
    • I²S, 用于音频数据,比 SLIMbus 简单

    ALSA 系统芯片 (ASoC) 中,以上各项统称为数字音频接口 (DAI)。

    1.4 Audio Signal Path(音频信号路径)

    音频信号路径术语涉及音频数据从应用传输到换能器(反之亦然)的信号路径。

    ADC

    Analog-to-digital converter.模拟转数字转换器。用于将模拟信号(在时间和振幅上保持连续的信号)转换为数字信号(在时间和振幅上离散的信号)的模块。从概念上讲,一个 ADC 包含一个周期性采样保持器,后跟一个量化器(尽管并不一定需要采用这种方式)。ADC 前面通常有一个低通滤波器,用来滤除通过目标采样率无法呈现的所有高频分量。如需了解详情,请参阅模拟转数字转换器

    AP

    Application processor. 应用处理器。移动设备上的主要通用计算系统。

    codec(编解码器)

    Coder-decoder. 编码器和解码器,用于将音频信号从一种表现形式编码和/或解码成另一种表现形式(通常是从模拟信号到 PCM 或从 PCM 到模拟信号)。严格来讲,“编解码器”同时指编码和解码模块,但也可仅泛指其中一个。如需了解详情,请参阅音频编解码器

    DAC

    Digital-to-analog converter.数字转模拟转换器,用于将数字信号(在时间和振幅上离散的信号)转换为模拟信号(在时间和振幅上保持连续的信号)的模块。DAC 后面通常有一个低通滤波器,用来滤除由数字量化引入的高频分量。如需了解详情,请参阅数字转模拟转换器

    DSP

    Digital Signal Processor. 数字信号处理器。可选组件,通常位于应用处理器之后(用于输出)或之前(用于输入)。主要用途是减轻应用处理器的负担,并以较低的功耗提供信号处理功能。

    PDM

    Pulse-density modulation. 脉冲密度调制。用于按数字信号表示模拟信号的调制形式,其中相对密度 1s 和 0s 表示信号电平。通常用于数字转模拟转换器。

    PWM

    Pulse-width modulation. 脉冲宽度调制。用于按数字信号表示模拟信号的调制形式,其中数字脉冲的相对宽度表示信号电平。通常用于模拟转数字转换器。

    transducer(换能器)

    将现实世界物理量中的变量转换为电信号。在音频中,物理量是声压,而换能器是扬声器和麦克风。

    1.5 Sample Rate Conversion(采样率转换)

    采样率转换术语涉及从一种采样率转换为另一种采样率的过程。

    downsample(降采样)

    重新采样,其中接收器采样率 < 信号源采样率。

    Nyquist frequency(奈奎斯特频率)

    可由离散信号以指定采样率的一半表示的最大频率分量。例如,由于人类的听力范围可达到近 20 kHz,因此数字音频信号的采样率必须至少有 40 kHz 才能代表该范围。在实践中,44.1 kHz 和 48 kHz 的采样率比较常用,对应的奈奎斯特频率分别为 22.05 kHz 和 24 kHz。

    resampler(重采样器)

    采样率转换器的同义词。

    resampling(重新采样)

    转换采样率的过程。

    sample rate converter(采样率转换器)

    执行重新采样的模块。

    sink(接收器)

    重采样器的输出端。

    source(信源)

    重采样器的输入端

    upsample(升采样)

    重新采样,其中接收器采样率 > 信源采样率。

    1.6 Telephony(电话通讯)

    AEC

    Acoustic Echo Cancellation is a means to reduce echo from a signal. For details, see Echo suppression and cancellation.

    ANC

    Active Noise Control is a means to improve the quality of a primary signal by actively adding the inverse of an unwanted secondary signal. For details, see Active noise control.

    dialer

    The app that provides the user interface for telephony.

    HCO

    Hearing Carry-Over is a TTY mode in which a message is sent as text and received as speech.

    sidetone

    Audible feedback from the local microphone into the local earpiece. For details, see Sidetone.

    TDD

    Telecommunications device for the deaf is a specific kind of Teletypewriter (TTY) for people with impaired hearing or speech.

    TTY

    Teletypewriter. Often used interchangeably with TDD.

    UE

    User equipment. The consumer phone device.

    UMTS

    Universal Mobile Telecommunications System. A type of mobile cellular system.

    VCO

    Voice Carry-Over is a TTY mode in which a message is sent as audio and received as text.

    2 Android 专用术语

    Android 专用术语包括仅在 Android 音频框架中使用的术语,以及在 Android 中具有特殊意义的通用术语。

    ALSA

    Advanced Linux Sound Architecture. 高级 Linux 声音体系。Linux 的音频框架,对其他系统也有影响。要了解通用定义,请参阅 ALSA。在 Android 中,ALSA 指的是内核音频框架和驱动程序,而不是用户模式 API。另请参阅“tinyalsa"

    audio device(音频设备)

    以 HAL 实现为基础的音频 I/O 端点。

    AudioEffect

    用于输出(处理后)音效与输入(处理前)音效的 API 和实现框架。该 API 在 android.media.audiofx.AudioEffect 中定义。

    AudioFlinger

    Android 声音服务器实现用例。AudioFlinger 在 mediaserver 进程中运行。

    audio focus(音频焦点)

    跨多个独立应用管理音频互动的 API 集。如需了解详情,请参阅管理音频焦点以及 android.media.AudioManager 的与焦点相关的方法和常量。

    AudioMixer

    AudioFlinger 中的模块,负责合并多个音轨以及应用衰减(音量)和音效。要了解通用定义,请参阅混音(录制的音乐)(将混合器当做一个硬件设备或软件应用而非系统中的软件模块)。

    audio policy(音频政策)

    负责所有需要先做出政策决策的操作的服务,例如打开新的 I/O 音频流、更改后重新路由,以及音频流音量管理。

    AudioRecord

    用于从麦克风等音频输入设备接收数据的主要低级别客户端 API。相应数据通常为 PCM 格式。该 API 在 android.media.AudioRecord 中定义。

    AudioResampler

    AudioFlinger 中的模块,负责采样率转换

    audio source(音频来源)

    一个常量枚举,用于为捕获音频输入指明目标使用情形。如需了解详情,请参阅音频来源。对于 21 级及以上级别的 API,建议使用音频属性

    AudioTrack

    用于向音响设备等音频输出设备发送数据的主要低级别客户端 API。相应数据通常为 PCM 格式。该 API 在 android.media.AudioTrack 中定义。

    audio_utils

    提供 PCM 格式转换、WAV 文件 I/O 以及非阻塞 FIFO 等功能的音频实用程序库,很大程度上独立于 Android 平台。

    client(客户端)

    通常指一个应用或应用客户端。不过,AudioFlinger 客户端可以是一个在 mediaserver 系统进程中运行的线程,例如,播放由 MediaPlayer 对象解码的媒体内容时。

    HAL

    Hardware Abstraction Layer. 硬件抽象层。HAL 在 Android 中是通用术语;涉及音频时,它是介于 AudioFlinger 和内核设备驱动程序之间的一个层,具有一个 C 语言编写的 API(取代了 C++ libaudio)。

    FastCapture

    AudioFlinger 中的线程。经配置,它会向延迟时间较短的 fast track 发送音频数据,并驱动输入设备的运行,以缩短延迟时间。

    FastMixer

    AudioFlinger 中的线程。经配置,它会从延迟时间较短的 fast track 接收并混合音频数据,同时驱动主要输出设备的运行,以缩短延迟时间。

    fast track

    部分设备和路由中具有较短延迟时间但功能较少的 AudioTrack 或 AudioRecord 客户端。

    MediaPlayer

    比 AudioTrack 级别更高的客户端 API,播放已编码的内容或包含多媒体音频和视频轨道的内容。

    media.log

    仅在定制版本中提供的 AudioFlinger 调试功能。用于在环形缓冲区中记录音频事件,然后可以根据需要倒回去撤消这些活动。

    mediaserver

    Android 系统进程,包含 AudioFlinger 等与媒体相关的服务

    NBAIO

    Non-blocking audio input/output. 非阻塞音频输入/输出,AudioFlinger 端口的抽象表示。此术语有一定的歧义,因为部分 NBAIO API 实现用例支持阻塞。NBAIO 的主要实现用例适用于不同的管道类型。

    normal mixer(常规混合器)

    AudioFlinger 中的线程,可用于大部分功能完善的 AudioTrack 客户端。它能直接驱动输出设备的运行,或通过管道将其子混音输入 FastMixer。

    OpenSL ES

    Khronos 集团推行的音频 API 标准。API 级别为 9 或更高级别的 Android 版本都支持原生音频 API(基于 OpenSL ES 1.0.1 的部分标准)。

    pro audio

    Abbreviation for the feature flag

    android.hardware.audio.pro. The requirements are documented in section 5.10 Professional Audio of the Android CDD. The "pro" in feature

    android.hardware.audio.pro refers to the level of predictable real-time performance, not the intended user.

    real-time

    Real-time computing systems guarantee a response to relevant events within a required time limit. Device implementation support for real-time computing is a necessary, but not sufficient, prerequisite for meeting the requirements of the

    android.hardware.audio.pro feature described above.

    Real-time performance also has benefits in other fields beyond audio, such as gaming, graphics, camera, video, sensor processing, Virtual Reality (VR), and Augmented Reality (AR).

    silent mode(静音模式)

    可由用户设置、用于将手机振铃器和通知设为静音而不会影响媒体内容播放(音乐、视频和游戏)或闹钟的功能。

    SoundPool

    比 AudioTrack 级别更高的客户端 API,可播放通过采样得到的音频片段,适用于触发界面反馈、游戏音效等。该 API 在 android.media.SoundPool 中定义。

    Stagefright

    请参阅媒体

    StateQueue

    AudioFlinger 中的模块,负责同步线程之间的状态。NBAIO 用于传递数据,而 StateQueue 用于传递控制信息。

    strategy(策略)

    具有类似行为的音频流类型构成的组,用于音频政策服务。

    stream type(音频流类型)

    表示音频输出使用情形的枚举。音频政策的实现用例会根据音频流类型以及其他参数来确定音量和路由决策。要查看音频流类型的列表,请参阅 android.media.AudioManager

    tee sink

    请参阅音频调试

    tinyalsa

    ALSA 内核之上采用 BSD 许可的小型用户模式 API。建议用于实现 HAL。

    ToneGenerator

    比 AudioTrack 级别更高的客户端 API,用于播放双音多频 (DTMF) 信号。如需了解详情,请参阅双音多频信号android.media.ToneGenerator 处的 API 定义。

    track(音轨)

    音频流。由 AudioTrack 或 AudioRecord API 控制。

    volume attenuation curve(音量衰减曲线)

    对于给定输出,音量衰减曲线指从通用音量指数到特定衰减因数的设备专属映射。

    volume index(音量指数)

    表示某个音频流的目标相对音量的整数(没有单位)。android.media.AudioManager 的音量相关 API 在运行时采用音量指数(而非绝对的衰减因数)。

    更多相关内容
  • 前言 音频编辑系列: – android音频编辑之音频...如果大家理解了android音频编辑之音频转换PCM与WAV和android音频编辑之音频裁剪的原理。那么音频拼接的原理其实就很好理解了。总的说来就是新建一个音频文件,将一段
  • 本篇开始讲解音频编辑的具体操作,从相对简单的音频裁剪开始。要进行音频裁剪,我的方案是开启一个Service服务用于音频裁剪的耗时操作,主界面发送裁剪命令,同时注册EventBus接受裁剪的消息(当然也可以使用广播...
  • WIFI环境下的实时语音,有源代码,可以继续修改实现更多功能
  • Android 调用自带的录制音频程序 Android中有自带的音频录制程序,我们可以通过指定一个Action MediaStore.Audio.Media.RECORD_SOUND_ACTION的Intent来 启动它就可以了。然后在onActivityResult()方法中,获取...
  • android音频开发

    2018-02-11 14:59:53
    ALSA系统包括驱动包alsa-drvier、开发包alsa-libs、开发包插件alsa-libplugins、设置管理工具包alsa-utils、其他声音相关处理小程序包alsa-tools、特殊音频固件支持包alsa-firmware、OSS接口模拟层工具alsa-oss共7...
  • Android音频剪辑裁剪自定义view,拖动剪切音频的时长,滑动滑块实时显示对应的时间点,指针可以滑动
  • android音频降噪webrtc

    热门讨论 2016-11-20 11:38:55
    android音频降噪,采用webrtc技术,提供底层源码和so库,亲测效果不错,请戴上耳机测试效果。
  • ndroid音频解码库libmad的动态库so文件,不过需要用android的NDK开发环境和了解JNI接口编写才能重新封装需要的接口!
  • android音频解码的源代码(适用于音乐播放器) 其他不多说了,文件不大,又不用积分,下了看看自己需不需要,也许正是你需要的。
  • Android音频

    2014-07-28 09:08:31
    介绍了android音频框架和操作流程。
  • android 音频录制

    2018-05-22 14:43:16
    音频录制音频录制音频录制音频录制音频录制音频录制音频录制音频录制音频录制
  • Android音频数据格式概述

    千次阅读 2022-02-16 12:22:37
    音频在计算机中保存的数据格式在采集、声学前处理、后期编辑、保存的各个阶段其格式是不一样的,这个其实困扰了我比较久,如果需要做HAL层或者更底层的音频相关开发,一定要了解音频在各个环节的数据格式,这个数据...

            音频在计算机中保存的数据格式在采集、声学前处理、后期编辑、保存的各个阶段其格式是不一样的,这个其实困扰了我比较久,如果需要做HAL层或者更底层的音频相关开发,一定要了解音频在各个环节的数据格式,这个数据格式也称为音频的表示,通常来讲:

            首先,在音频的采集环节,把模拟信号变换成数字信号的ADC通常只输出整数,这个时候16比特或者24/32比特;

            为了防止录音的时候clip,一般都要留出12dB的head room,你要用16比特ADC的话就只用了11-12比特了。所以用24比特甚至更高的ADC会大大提高采样的精度。

            录音采集取样的数据格式跟后续声学前处理、编辑制作期间的格式并不需要保持一致。在制作过程中使用32位浮点/定点格式什么的都很正常,尽最大可能保留原始素材数据的精度,并给各种数据运算留下计算的余量和空间。

            最后各种处理完后,再搞一次归一化,把最高电平调整到0dBFS,也就是把32位浮点数映射变换成16比特整数,送去保存或者其他处理。

            对Android系统来讲,采用了多种音频的数据格式,例如原始PCM通常是整数,因为定点值通常作为整数值存储和操作的默认方式,所以可以默认整数就是用定点数保存。下面就讲下定点数和浮点数,如果还记得当年的计算机基础,其实就不用看了。

            之所以用到浮点数,是因为浮点数在运算的时候有更大的表示范围。

    1 定点数

    1.1 定点数概念

            定点数是在计算机中表示数字的一种方式,它既可以表示整数,也可以表示小数。

            但是为什么我们平时说到整数,我们就说它是一个定点数,说到小数,就说它是一个浮点数,这种说法是正确的吗?

            要想理解什么是“定点数”,首先,我们需要理解“定点”究竟是什么意思?

            我们都知道,数字既包括整数,又包括小数,而小数的精度范围要比整数大得多,所以如果我们想在计算机中,既能表示整数,也能表示小数,关键就在于这个小数点如何表示?

            于是人们想出一种方法,即约定计算机中小数点的位置,且这个位置固定不变,小数点前、后的数字,分别用二进制表示,然后组合起来就可以把这个数字在计算机中存储起来,这种表示方式叫做“定点”表示法,用这种方法表示的数字叫做“定点数”。

            也就是说“定”是指固定的意思,“点”是指小数点,小数点位置固定即定点数名字的由来。

    1.2 定点数的表示

            在固定 bit 下,约定小数点的位置,然后把整数部分和小数部分分别转换为二进制,就是定点数的结果,既然定点数只是表示数字的一种方式,它既可以表示整数,也可以表示小数。

            定点数如果要表示整数或小数,分为以下三种情况:

            1)纯整数:例如整数100,小数点其实在最后一位,所以忽略不写;

            2)纯小数:例如:0.123,小数点固定在最高位;

            3)整数+小数:例如1.24、10.34,小数点在指定某个位置;

            对于前两种情况,纯整数和纯小数,因为小数点固定在最低位和最高位,所以它们用定点数表示时,原理是相同的,只需要把整数部分、小数部分,按照十进制转二进制的规则,分别转换即可。

            而对于整数 + 小数的情况,用定点表示时,需要约定小数点的位置,才能在计算机中表示。

            对于纯整数100,由于小数点固定在最低位,假定我们以 1 个字节(8 bit)表示,用定点数表示如下(D为十进制缩写,B为二进制缩写):

            100(D) = 01100100(B)

            对于纯小数 0.125,由于小数点固定在最高位,同样以 1 个字节(8 bit)表示,用定点数表示如下:

            0.125(D) = 0.00100000(B)

            从以上例子可以看出,这 2 种情况用定点数表示都比较简单,按照十进制转为二进制规则,即可得到结果。

            对于整数 + 小数的数字,这种情况下,我们需要先约定小数点的位置。

            依旧以 1 个字节(8 bit)为例,我们可以约定前 5 位表示整数部分,后 3 位表示小数部分。对于数字 1.5 用定点数表示就是这样:

            1.5(D) = 00001 100(B)

            数字 25.125 用定点数表示就是这样:

            25.125(D) = 11001 001(B)

            这就是用定点数表示一个小数的方式。这里再总结一下这个过程:

            1)在有限的 bit 宽度下,先约定小数点的位置;

            2)整数部分和小数部分,分别转换为二进制表示;

            3)两部分二进制组合起来,即是结果;

    1.3 定点数的精度

            受限于小数点的位置,用定点数表示小数时,数值的范围和小数精度是有限的。比方说上面的例子中我们约定了前 5 位表示整数部分,后 3 位表示小数部分,此时这个整数部分的二进制最大值只能是 11111,即十进制的 31,小数部分的二进制最大只能表示 0.111,即十进制的 0.875。

            如果我们想要表示更大范围的值,怎么办?

            扩大 bit 的宽度:例如使用 2 个字节、4 个字节,这样整数部分和小数部分宽度增加,表示范围也就变大了。

            改变小数点的位置:小数点向后移动,整个数字范围就会扩大,但是小数部分的精度就会越来越低,没有办法表示类似 0.00001 这种高精度的值。

            由此我们发现,不管如何约定小数点的位置,都会存在以下问题:

            1)数值的表示范围有限(小数点越靠左,整个数值范围越小);

            2)数值的精度范围有限(小数点越靠右,数值精度越低)

            总的来说,就是用定点数表示的小数,不仅数值的范围表示有限,而且其精度也很低。要想解决这 2 个问题,所以人们就提出了使用“浮点数”的方式表示数字。

            虽然定点数表示数字,存在以上说的这些问题,但也只是在表示小数的场景下。如果只是用于表示整数,还是非常方便的。

            所以,现代计算机中一般使用定点数来表示整数。在现代计算机中,定点数通常用来表示整数,对于高精度的小数,通常用浮点数表示;

    2 浮点数

            理解浮点数抓住一下几点即可。

    2.1 浮点数一般用科学计数法表示

            前面我们讲了定点数,其中“定点”指的是约定小数点位置固定不变。那浮点数的“浮点”就是指,其小数点的位置是可以是漂浮不定的。

            其实,浮点数是采用科学计数法的方式来表示的,例如十进制小数 1.234,用科学计数法表示,可以有多种方式:

            1.234 = 1.234 * 10^0

            1.234 = 12.34 * 10^-1

            1.234 = 123.4 * 10^-2

            。。。

            用这种科学计数法的方式表示小数时,小数点的位置就变得「漂浮不定」了,这就是相对于定点数,浮点数名字的由来。

    2.2 浮点数表示方法

            我们已经知道,浮点数是采用科学计数法来表示一个数字的,它的格式可以写成这样:

            V = (-1)^S * M * R^E

            其中各个变量的含义如下:

            S:符号位,取值 0 或 1,决定一个数字的符号,0 表示正,1 表示负

            M:尾数,用小数表示,例如前面所看到的 8.345 * 10^0,8.345 就是尾数

            R:基数,表示十进制数 R 就是 10,表示二进制数 R 就是 2

            E:指数,用整数表示,例如前面看到的 10^-1,-1 即是指数

            如果我们要在计算机中,用浮点数表示一个数字,只需要确认这几个变量即可。把科学计数法中的变量,填充到固定 bit 中,即是浮点数的结果。

            我们举一个例子,假设现在我们用 32 bit 表示一个浮点数,把以上变量按照一定规则,填充到这些 bit 上就可以了:

            假设我们定义如下规则来填充这些 bit:

            符号位 S 占 1 bit

            指数 E 占 10 bit

            尾数 M 占 21 bit

            按照这个规则,将十进制数 25.125 转换为浮点数,转换过程就是这样的(D代表十进制,B代表二进制):

            整数部分:25(D) = 11001(B)

            小数部分:0.125(D) = 0.001(B)

            用二进制科学计数法表示:25.125(D) = 11001.001(B) = 1.1001001 * 2^4(B)

            所以符号位 S = 0,尾数 M = 1.001001(B),指数 E = 4(D) = 100(B)。

            按照上面定义的规则,填充到 32 bit 上,就是这样:

            我们可以看到,指数和尾数分配的位数不同,会产生以下情况:

            1)指数位越多,尾数位则越少,其表示的范围越大,但精度就会变差,反之,指数位越少,尾数位则越多,表示的范围越小,但精度就会变好;

            2)一个数字的浮点数格式,会因为定义的规则不同,得到的结果也不同,表示的范围和精度也有差异;

    2.3 浮点数标准

            在浮点数提出的早期,各个计算机厂商各自制定自己的浮点数规则,导致不同厂商对于同一个数字的浮点数表示各不相同,在计算时还需要先进行转换才能进行计算。

            后来 IEEE 组织提出了浮点数的标准,统一了浮点数的格式,并规定了单精度浮点数 float 和双精度浮点数 double,从此以后各个计算机厂商统一了浮点数的格式,一直延续至今。在1985年,IEEE 组织推出了浮点数标准,就是我们经常听到的 IEEE754 浮点数标准,这个标准统一了浮点数的表示形式,并提供了 2 种浮点格式:

            1)单精度浮点数 float:32 位,符号位 S 占 1 bit,指数 E 占 8 bit,尾数 M 占 23 bit

            2)双精度浮点数 float:64 位,符号位 S 占 1 bit,指数 E 占 11 bit,尾数 M 占 52 bit

            为了使其表示的数字范围、精度最大化,浮点数标准还对指数和尾数进行了规定:

            尾数 M 的第一位总是 1(因为 1 <= M < 2),因此这个 1 可以省略不写,它是个隐藏位,这样单精度 23 位尾数可以表示了 24 位有效数字,双精度 52 位尾数可以表示 53 位有效数字

            指数 E 是个无符号整数,表示 float 时,一共占 8 bit,所以它的取值范围为 0 ~ 255。但因为指数可以是负的,所以规定在存入 E 时在它原本的值加上一个中间数 127,这样 E 的取值范围为 -127 ~ 128。表示 double 时,一共占 11 bit,存入 E 时加上中间数 1023,这样取值范围为 -1023 ~ 1024。

            除了规定尾数和指数位,还做了以下规定:

            指数 E 非全 0 且非全 1:规格化数字,按上面的规则正常计算

            指数 E 全 0,尾数非 0:非规格化数,尾数隐藏位不再是 1,而是 0(M = 0.xxxxx),这样可以表示 0 和很小的数

            指数 E 全 1,尾数全 0:正无穷大/负无穷大(正负取决于 S 符号位)

            指数 E 全 1,尾数非 0:NaN(Not a Number)

    2.4 浮点数精度

            浮点数在表示小数时,由于十进制小数在转换为二进制时,存在无法精确转换的情况,而在固定 bit 的计算机中存储时会被截断,所以浮点数表示小数可能存在精度损失。

            如果我们现在想用浮点数表示 0.2,它的结果会是多少呢?

            0.2 转换为二进制数的过程为,不断乘以 2,直到不存在小数为止,在这个计算过程中,得到的整数部分从上到下排列就是二进制的结果。

            0.2 * 2 = 0.4 -> 0

            0.4 * 2 = 0.8 -> 0

            0.8 * 2 = 1.6 -> 1

            0.6 * 2 = 1.2 -> 1

            0.2 * 2 = 0.4 -> 0(发生循环)

            。。。

            所以 0.2(D) = 0.00110...(B)。

            因为十进制的 0.2 无法精确转换成二进制小数,而计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。

            浮点数在表示一个数字时,其范围和精度非常大,所以我们平时使用的小数,在计算机中通常用浮点数来存储

            最后,我们再来看一下,用浮点数表示一个数字,其范围和精度能有多大?

            以单精度浮点数 float 为例,它能表示的最大二进制数为 +1.1.11111...1 * 2 ^127(小数点后23个1),而二进制 1.11111...1 ≈ 2,所以 float 能表示的最大数为 2^128 = 3.4 * 10^38,即 float 的表示范围为:-3.4 * 10^38 ~ 3.4 * 10 ^38。

            它能表示的精度有多小呢?

            float 能表示的最小二进制数为 0.0000....1(小数点后22个0,1个1),用十进制数表示就是 1/2^23。

            用同样的方法可以算出,double 能表示的最大二进制数为 +1.111...111(小数点后52个1) * 2^1023 ≈ 2^1024 = 1.79 * 10^308,所以 double 能表示范围为:-1.79 * 10^308 ~ +1.79 * 10^308。

            double 的最小精度为:0.0000...1(51个0,1个1),用十进制表示就是 1/2^52。

            双精度浮点数:

     

            从这里可以看出,虽然浮点数的范围和精度也有限,但其范围和精度都已非常之大,所以在计算机中,对于小数的表示我们通常会使用浮点数来存储。

    3 Android中的音频数据格式

            复习了一下计算机中数值的表示,具体到Android, 在内部使用多种音频 数据格式。

    3.1 Android音频特性

            基本上在前面的章节也都讲了,音频数据格式按其属性分类:

            压缩

            未压缩、无损压缩或有损压缩。PCM 是最常见的未压缩音频格式。FLAC 是一种无损压缩格式,而 MP3 和 AAC 是有损压缩格式。

            位深

            每个音频样本的有效位数量。

            容器大小

            用于存储或传输样本的位数。通常与位深相同,但是有时会为了对齐而分配额外的填充位。例如,一个 24 位样本可以包含在一个 32 位字中。

            对齐方式

            如果容器大小与位深完全相同,该表示法被称为“打包”。否则,表示法为“解包”。样本的有效位通常与容器的最左(最高有效)或最右(最低有效)位对齐。通常只有当位深不是 2 的幂时,才使用术语“打包”和“解包”。

            符号性

            样本是有符号,还是无符号。

            表示法

            定点数或浮点数(见下文)。

    3.2 定点表示

            定点数是未压缩 PCM 音频数据的最常见表示法,特别是对于硬件接口。

            定点数在小数点前后具有固定(恒定)位数。我们所有的表示法都使用基数 2,因此我们用“位”代替“位数”,用“二进制点”或简单的“点”代替“小数点”。点左边的位是整数部分,点右边的位是小数部分。

            我们之所以用“整数 PCM”的说法,是因为定点数值通常作为整数值进行存储和操作。隐含的解释就是定点数。

            我们对所有有符号的定点数表示法使用二进制补码,因此下列表达式中的所有值都以 LSB 为单位:

            Q 和 U 标记

            有各种标记用于整数中的定点数表示法。我们使用 Q 标记:Qm.n 表示 m 个整数位,n 个小数位。“Q”计为一位,尽管值以二进制补码表示。总位数为 m + n + 1。

            Um.n 用于无符号数:m 个整数位和 n 个小数位,并且“U”计为零位。总位数为 m + n。

            整数部分可以在最终结果中使用,也可以临时使用。在后一种情况下,构成整数部分的位称为“保护位”。保护位允许中间计算溢出,只要最终值在某个范围内或者可以限制在该范围内。请注意,定点数保护位位于左侧,而用于减少舍入误差的浮点数单元保护位位于右侧。

    3.3 浮点表示

            浮点是定点的替代,其中点的位置可以变化。浮点的主要优点包括:

            1)更大的动态余量 和动态范围;浮点运算允许在中间计算期间超出标称范围,并且只在最后钳制值;

            2)支持特殊值,例如无穷大和 NaN;

            3)在许多情况下更易于使用

            从历史上看,浮点算术比整数或定点算术慢,但现在浮点运算速度更快是很常见的,前提是控制流决策不基于计算值。

    3.4 Android 音频格式

            下表列出了主要的 Android 音频格式:

            上述所有定点格式的标称范围为 -1.0 至 +1.0 减去一个 LSB。由于二进制补码表示,负值比正值多一个。上面备注如下:

            1.以上所有格式都表示签名样本值。8 位格式通常被称为“无符号”,但它实际上是一个偏置为 的有符号值

       0.10000000

            2.Q0.23 可以打包成 24 位(三个 8 位字节,小端),也可以解包成 32 位。如果解包,有效位要么右对齐到 LSB,符号扩展填充到 MSB(Q8.23),要么左对齐到 MSB,零填充到 LSB(Q0.31)。Q0.31 理论上允许最多 32 个有效位,但接受 Q0.31 的硬件接口很少使用所有位。

            3.单精度浮点数有 23 个显式位加上 1 个隐藏位和符号位,总共 25 个有效位。 非正规数 的有效位较少。

            4.单精度浮点数可以表达高达±1.7e+38 的值,这解释了大的余量。

            5.显示的动态范围适用于高达标称最大值 ±1.0 的非规范化。请注意,某些特定于体系结构的浮点实现(例如 NEON) 不支持非规范化。

    3.5 转换

            本部分将讨论各种表示法之间的数据转换

    浮点数转换

            将值从 Qm.n 格式转换为浮点数:

            1)将该值转换为浮点数,就像它是一个整数一样(通过忽略该点)。

            2)乘以 2-n。

            例如,如需将 Q4.27 内部值转换为浮点数,请使用:

            float = integer * (2 ^ -27)

            从浮点数转换为定点数会遵循以下规则:

            1)单精度浮点数的标称范围为 ±1.0,但中间值的完整范围为 ±1.7e+38。外部表示法中的浮点数和定点数之间的转换(例如输出到音频设备)将仅考虑标称范围,对超过该范围的值会进行限制。尤其是,当 +1.0 被转换为定点数格式时,它将被限制为 +1.0 减去一个 LSB。

            2)非规格化数(次正规数)和 +/- 0.0 在表示法中都允许使用,但在处理过程中可能会静默转换为 0.0。

            3)无穷数可能会通过操作或者静默地硬限制为 +/- 1.0。通常后者用于转换为定点数格式。

            4)NaN 行为尚未定义:NaN 可以作为相同的 NaN 传递,也可以转换为默认 NaN;可以静默地硬限制为 +/- 1.0,也可以静默地转换为 0.0,或者导致错误。

    定点数转换

            不同 Qm.n 格式之间的转换会遵循以下规则:

            1)当 m 增加时,用符号扩展左边的整数部分。

            2)当 m 减小时,限制整数部分。

            3)当 n 增加时,用零扩展右边的小数部分。

            4)当 n 减少时,抖动、舍入或截断右侧的多余小数位。

            例如,如需将 Q4.27 值转换为 Q0.15(无抖动或舍入),请将 Q4.27 值右移 12 位,并限制超过 16 位有符号范围的任何结果。这会对齐 Q 表示法的点。

            如需将 Q7.24 转换为 Q7.23,可进行带符号除以 2,或者等价地将符号位添加到 Q7.24 整数,然后带符号右移 1。请注意,简单带符号右移不等于带符号除以 2。

    有损和无损转换

            如果转换可逆,则是无损的:从 A 转换到 B 再到 C,那么可以得出 A = C。否则,转换是有损的。

            无损转换允许往返格式转换。

            从具有 25 位或更少有效位的定点数表示法转换到浮点数是无损的。从浮点数转换到任何常见的定点数表示法则是有损的。

    展开全文
  • Android 音频(Audio)架构

    千次阅读 2022-04-08 09:24:12
    Android音频硬件抽象层 (HAL) 可将 android.media 中特定于音频的较高级别的框架 API 连接到底层音频驱动程序和硬件。本部分介绍了有关提升性能的实现说明和提示。 Android 音频架构定义了音频功能的实现方式,并...

    一、概述

    Android 的音频硬件抽象层 (HAL) 可将 android.media 中特定于音频的较高级别的框架 API 连接到底层音频驱动程序和硬件。本部分介绍了有关提升性能的实现说明和提示。

    Android 音频架构定义了音频功能的实现方式,并指出实现中所涉及的相关源代码。
    在这里插入图片描述

    应用框架

    应用框架包含应用代码,该代码使用 android.media API 与音频硬件进行交互。在内部,此代码会调用相应的 JNI 粘合类来访问与音频硬件互动的原生代码。

    • 源代码目录:frameworks/base/media/java/android/media/
    • AudioManager:音频管理器,包括音量管理、AudioFocus管理、音频设备管理、模式管理;
    • 录音:AudioRecord、MediaRecorder;
    • 播放:AudioTrack、MedaiPlayer、SoundPool、ToneGenerator;
    • 编解码:MediaCodec,音视频数据 编解码接口。

    JNI

    与 android.media 关联的 JNI 代码会调用较低级别的原生代码来访问音频硬件。JNI 位于 frameworks/base/core/jni/ 和 frameworks/base/media/jni 中。

    Native framework 原生框架

    原生框架提供相当于 android.media 软件包的原生软件包,它调用 Binder IPC 代理来访问媒体服务器的音频专属服务。 原生框架代码位于 frameworks/av/media/libmedia 中。

    原生框架代码位于 frameworks/av/media/libmedia 或frameworks/av/media/libaudioclient中(不同版本,位置有所改变)。

    Binder IPC

    Binder IPC 代理用于促进跨越进程边界的通信。代理位于 frameworks/av/media/libmedia 中,并以字母“I”开头。

    Audio Server 媒体服务器

    Audio系统在Android中负责音频方面的数据流传输和控制功能,也负责音频设备的管理。这个部分作为Android的Audio系统的输入/输出层次,一般负责播放PCM声音输出和从外部获取PCM声音,以及管理声音设备和设置(注意:解码功能不在这里实现,在android系统里音频视频的解码是opencore或stagefright完成的,在解码之后才调用音频系统的接口,创建音频流并播放)。Audio服务在Android N(7.0)之前存在于mediaserver中,Android N开始以audioserver形式存在,这些音频服务是与HAL 实现进行交互的实际代码。媒体服务器位于 frameworks/av/services/audioflinger 和frameworks/av/services/audiopolicy中。

    Audio服务包含AudioFlinger 和AudioPolicyService:

    • AudioFlinger:主要负责音频流设备的管理以及音频流数据的处理传输,⾳量计算,重采样、混⾳、⾳效等。
    • AudioPolicyService:主要负责⾳频策略相关,⾳量调节⽣效,设备选择,⾳频通路选择等。

    HAL

    HAL 定义了音频服务会调用且您必须实现才能使音频硬件正常运行的标准接口。音频 HAL 接口位于 hardware/libhardware/include/hardware 中。详情可参阅 audio.h。

    内核驱动程序

    音频驱动程序用于同您的硬件和 HAL 实现进行交互。可以使用高级 Linux 声音架构 (ALSA)、开放声音系统 (OSS) 或自定义驱动程序(HAL 与驱动程序无关)。

    注意:如果使用的是 ALSA,建议将 external/tinyalsa 用于驱动程序的用户部分,因为它具有兼容的许可(标准的用户模式库已获得 GPL 许可)。

    二、音频系统架构的演进

    一个好的系统架构,需要尽可能地降低上层与具体硬件的耦合,这既是操作系统的设计目的,对于音频系统也是如此。音频系统的雏形框架可以简单的用下图来表示:
    在这里插入图片描述在这个图中,除去Linux本身的Audio驱动外,整个Android音频实现都被看成了User。因而我们可以认为Audio Driver就是上层与硬件间的“隔离板”。但是如果单纯采用上图所示的框架来设计音频系统,对上层应用使用音频功能是不小的负担,显然Android开发团队还会根据自身的实际情况来进一步细化“User”部分。具体该怎么细化呢?如果是让我们去细化我们该怎么做呢?

    首先作为一个操作系统要对外提供可用的API,供应用开发者调用。APP开发者开发的应用我们称APP,我们提供的API姑且叫Framework。如果Framework直接和驱动交互有什么问题呢?

    1. 首先是耦合问题,接口和实现耦合,硬件层有任何变动都需要接口层适配,我们增加一层硬件适配层;

    2. 资源统一管理的问题,如果多个APP调用相同API使用硬件资源,改怎么分配?增加统一资源管理器,其实就是对应Android系统的Audio Lib层。

    细化后我们发现,整个结构对应的就就是Android的几个层次结构,包括应用层、framework层、库层以及HAL层,如下图所示:
    在这里插入图片描述

    2.1 Lib层

    framework层的大多数类,其实只是应用程序使用Android库文件的“中介”,它只是个壳子。因为Android应用采用java语言编写,它们需要最直接的java接口的支持,如果我们的Android系统支持另一种语言的运行时,那么可以提供另一种语言的接口支持(比如Go),这就是framework层存在的意义之一。但是作为“中介”,它们并不会真正去实现具体的功能,或者只实现其中的一部分功能,而把主要重心放在核心库中来完成。比如上面的AudioTrack、AudioRecorder、MediaPlayer和MediaRecorder等等在库中都能找到相对应的类,这些多数是C++语言编写的。

    我们再从另一个线索来思考这个问题:我们提供的API供应用层调用,那么这个API最终运行在应用的进程中。如果多个应用同时使用这个功能就会冲突;再一个允许任何一个进程操作硬件也是个危险的行为。那么真相就浮出了水面:我们需要一个有权限管理和硬件交互的进程,需要调用某个硬件服务必须和我这个服务打交道。这就是Android系统的很常用的C/S结构以及Binder存在的主要原因。Android系统中的Server就是一个个系统服务,比如ServiceManager、LocationManagerService、ActivityManagerService等等,以及管理图像合成的SurfaceFlinger,和今天我们今天介绍的音频服务AudioFlinger和AudioPolicyService。它们的代码放置在frameworks/av/services/audioflinger,生成的最主要的库叫做libaudioflinger。

    这里也提到了分析源码除以模块为线索外的另一种线索以进程为线索。库并不代表一个进程,但是进程则依赖于库来运行。虽然有的类是在同一个库中实现的,但并不代表它们会在同一个进程中被调用。比如AudioFlinger和AudioPolicyService都驻留于名为mediaserver的系统进程中;而AudioTrack/AudioRecorder和MediaPlayer/MediaRecorder只是应用进程的一部分,它们通过binder服务来与其它audioflinger等系统进程通信

    2.2 HAL层

    硬件抽象层顾名思义为适配不同硬件而独立封装的一层,音频硬件抽象层的任务是将AudioFlinger/AudioPolicyService真正地与硬件设备关联起来,但又必须提供灵活的结构来应对变化。

    从设计上来看,硬件抽象层是AudioFlinger直接访问的对象。这里体现了两方面的考虑:

    1. 一方面AudioFlinger并不直接调用底层的驱动程序;

    2. 另一方面,AudioFlinger上层(包括和它同一层的MediaPlayerService)的模块只需要与它进行交互就可以实现音频相关的功能了。

    AudioFlinger和HAL是整个架构解耦的核心层,通过HAL层的audio.primary等库抹平音频设备间的差异,无论硬件如何变化,不需要大规模地修改上层实现,保证系统对外暴露的上层API不需要修改,达成高内聚低耦合。而对厂商而言,在定制时的重点就是如何在这部分库中进行高效实现了。

    举个例子,以前Android系统中的Audio系统依赖于ALSA-lib,但后期就变为了tinyalsa,这样的转变不应该对上层造成破坏。因而Audio HAL提供了统一的接口来定义它与AudioFlinger/AudioPolicyService之间的通信方式,这就是audio_hw_device、audio_stream_in及audio_stream_out等等存在的目的,这些Struct数据类型内部大多只是函数指针的定义,是一个个句柄。当AudioFlinger/AudioPolicyService初始化时,它们会去寻找系统中最匹配的实现(这些实现驻留在以audio.primary.*,audio.a2dp.*为名的各种库中)来填充这些“壳”,可以理解成是一种“多态”的实现。

    三、Linux平台下的两种主要的音频驱动架构接收

    3.1 OSS(Open Sound System)

    早期Linux版本采用的是OSS框架,它也是Unix及类Unix系统中广泛使用的一种音频体系。OSS既可以指OSS接口本身,也可以用来表示接口的实现。OSS的作者是Hannu Savolainen,就职于4Front Technologies公司。由于涉及到知识产权问题,OSS后期的支持与改善不是很好,这也是Linux内核最终放弃OSS的一个原因。

    另外,OSS在某些方面也遭到了人们的质疑,比如:

    • 对新音频特性的支持不足;
    • 缺乏对最新内核特性的支持等等。

    当然,OSS做为Unix下统一音频处理操作的早期实现,本身算是比较成功的。它符合“一切都是文件”的设计理念,而且做为一种体系框架,其更多地只是规定了应用程序与操作系统音频驱动间的交互,因而各个系统可以根据实际的需求进行定制开发。总的来说,OSS使用了如下表所示的设备节点:

    设备节点说明
    /dev/dsp向此文件写数据à输出到外放Speaker向此文件读数据à从Microphone进行录音
    /dev/mixer混音器,用于对音频设备进行相关设置,比如音量调节
    /dev/midi00第一个MIDI端口,还有midi01,midi02等等
    /dev/sequencer用于访问合成器(synthesizer),常用于游戏等效果的产生

    3.2 ALSA(Advanced Linux Sound Architecture)

    ALSA是Linux社区为了取代OSS而提出的一种框架,是一个源代码完全开放的系统(遵循GNU GPL和GNU LGPL)。ALSA在Kernel 2.5版本中被正式引入后,OSS就逐步被排除在内核之外。当然,OSS本身还是在不断维护的,只是不再为Kernel所采用而已。

    ALSA相对于OSS提供了更多,也更为复杂的API接口,因而开发难度相对来讲加大了一些。为此,ALSA专门提供了一个供开发者使用的工具库,以帮助他们更好地使用ALSA的API。根据官方文档的介绍,ALSA有如下特性:

    • 高效支持大多数类型的audio interface(不论是消费型或者是专业型的多声道声卡)
    • 高度模块化的声音驱动
    • SMP及线程安全(thread-safe)设计
    • 在用户空间提供了alsa-lib来简化应用程序的编写
    • 与OSS API保持兼容,这样子可以保证老的OSS程序在系统中正确运行

    ALSA主要由下表所示的几个部分组成:

    ElimentDescription
    alsa-driver内核驱动包
    alsa-tools包含一系列工具程序
    alsa-utils包含了很多使用的小程序,比如alsactl:用于保存设备设置amixer:是一个命令行程序,用于音量和其他声音控制alsamixer的ncurses版acconnect和aseqview:制作MIDI连接,以及检查已经连接的端口列表,aplay和arecord:两个命令行程序,分别用于播放和录制多种格式的音频
    alsa-plugins插件包,比如jack,pulse,maemo
    alsa-oss用于兼容OSS的模拟包
    pyalsa用于编译python版本的alsa lib
    alsa-lib用户空间函数
    alsa-firmware音频固件支持包
    Alsa主要的文件节点如下:
    • Information Interface (/proc/asound)
    • Control Interface (/dev/snd/controlCX)
    • Mixer Interface (/dev/snd/mixerCXDX)
    • PCM Interface (/dev/snd/pcmCXDX)
    • Raw MIDI Interface (/dev/snd/midiCXDX)
    • Sequencer Interface (/dev/snd/seq)
    • Timer Interface (/dev/snd/timer)

    Android的TinyALSA是基于Linux ALSA基础改造而来。一看“Tiny”这个词,我们应该能猜到这是一个ALSA的缩减版本。实际上在Android系统的其它地方也可以看到类似的做法——既想用开源项目,又嫌工程太大太繁琐,怎么办?那就只能瘦身了,于是很多Tiny-XXX就出现了。

    在早期版本中,Android系统的音频架构主要是基于ALSA的,其上层实现可以看做是ALSA的一种“应用”。后来可能是由于ALSA所存在的一些不足,Android后期版本开始不再依赖于ALSA提供的用户空间层的实现。HAL层最终依赖alsa-lib库与驱动层交互。

    展开全文
  • 修改和定制Android音频策略——以车载导航仪为例
  • Android音频剪辑

    2022-07-08 16:40:35
    Android音频剪辑
  • 参考:http://blog.csdn.net/u013370255/article/details/54691643
  • Android 系统中,一般使用 AudioRecord 或者 MediaRecord 来采集音频。 AudioRecord 是一个比较偏底层的API,它可以获取到一帧帧 PCM 数据,之后可以对这些数据进行处理。 而 MediaRecorder 是基于 AudioRecorder ...
  • Android 音频架构

    2021-03-01 22:11:53
    Android 音频架构定义了音频功能的实现方式,并指出实现中所涉及的相关源代码。 应用框架 应用框架包含应用代码,该代码可使用 android.media API 与音频硬件进行交互。在内部,此代码会调用相应的 JNI 粘合类,以...

    Android 音频架构定义了音频功能的实现方式,并指出实现中所涉及的相关源代码。
    音频架构

    • 应用框架
      应用框架包含应用代码,该代码可使用 android.media API 与音频硬件进行交互。在内部,此代码会调用相应的 JNI 粘合类,以访问与音频硬件交互的原生代码。
      源代码目录:frameworks/base/media/java/android/media/
    • AudioManager:音频管理器,包括音量管理、AudioFocus管理、音频设备管理、模式管理;
    • 录音:AudioRecord、MediaRecorder,采集音频数据;
    • 播放:AudioTrack、MedaiPlayer、SoundPool、ToneGenerator,播放数据api;
    • 编解码:MediaCodec,音视频数据 编解码接口。
    • JNI
      与 android.media 关联的 JNI 代码可调用较低级别的原生代码,以访问音频硬件。JNI 位于 frameworks/base/core/jni/ 和 frameworks/base/media/jni 中。
    • Native framework 原生框架
      原生框架可提供相当于 android.media 软件包的原生软件包,从而调用 Binder IPC 代理以访问媒体服务器的特定于音频的服务。原生框架代码位于 frameworks/av/media/libmedia 或frameworks/av/media/libaudioclient中(不同版本,位置有所改变)。
    • Binder IPC
      Binder IPC 代理用于促进跨越进程边界的通信。代理位于 frameworks/av/media/libmedia或frameworks/av/media/libaudioclient 中,并以字母“I”开头。
    • server
      Audio服务在Android N(7.0)之前存在于mediaserver中,Android N开始以audioserver形式存在,这些音频服务是与您的 HAL 实现进行交互的实际代码。媒体服务器位于 frameworks/av/services/audioflinger 和frameworks/av/services/audiopolicy中。

    Audio服务包含AudioFlinger 和AudioPolicyService

    • AudioFlinger:主要负责音频流设备的管理以及音频流数据的处理传输,⾳量计算,重采样、混⾳、⾳效等。
    • AudioPolicyService:主要负责⾳频策略相关,⾳量调节⽣效,设备选择,⾳频通路选择等。
    • HAL
      HAL 定义了由音频服务调用且您必须实现以确保音频硬件功能正常运行的标准接口。音频 HAL 接口位于 hardware/libhardware/include/hardware 中。如需了解详情,请参阅 audio.h。
    • 内核驱动程序
      音频驱动程序可与您的硬件和 HAL 实现进行交互。您可以使用高级 Linux 音频架构 (ALSA)、开放声音系统 (OSS) 或自定义驱动程序(HAL 与驱动程序无关)。
      注意:如果您使用的是 ALSA,建议将 external/tinyalsa 用于驱动程序的用户部分,因为它具有兼容的许可(标准的用户模式库已获得 GPL 许可)。

    Android 的音频硬件抽象层 (HAL) 可将 android.media 中特定于音频的较高级别框架 API 连接到底层音频驱动程序和硬件。

    展开全文
  • 实测Android音频的焦点获取和归还

    千次阅读 2022-02-09 09:25:11
    实测Android音频的焦点获取和归还 前言 最近老板想在产品中的短视频后者直播播放的时候对于手机中的音乐播放器进行暂停播放,并且退出视频播放后手机的音乐播放器还能继续播放之前的音乐。 先试试微信,emmm,确实...
  • 首先看下音频录制跟播放效果简图: CSDN不支持本地视频上传,我就先上传了一张截图: 上面是录音:长按即可录音,支持声波动画,右滑删除等。支持录制pcm、wav、mp3格式音频。 下面是播放:点击左边扬声器icon...
  • 白话Android音频系统原理

    千次阅读 2022-02-14 20:44:57
    白话Android音频系统原理一、基本原理二、详细逻辑三、播放流程 一、基本原理 谁来处理(录音和播放)? AudioFlinger! 怎么处理?AudioPolicyService ! 什么是output?为了便于管理, 把一个设备上具有相同参数的...
  • 第二章:Android 音频框架 音频系统算是在Android中一个比较复杂的模块,他的整体框架和Android是一样的,先看一下他的框架图: 对于上面的框架图我们主要看一下audio相关的,因为AudioTrack只能播放pcm、wav格式的...
  • 一、Android音频开发(一):音频基础知识 二、Android音频开发(二):录制WAV格式音频 三、Android音频开发(三):录制MP3格式音频 四、Android音频开发(四):使用Exoplayer播放音频 五、Android音频开发(五):音频播放...
  • Android音频实时传输与播放
  • 本篇开始讲解在Android平台上进行的音频编辑开发,首先需要对音频相关概念有基础的认识。所以本篇要讲解以下内容: 1. 常用音频格式简介 2. WAV和PCM的区别和联系 3. WAV文件头信息 4. 采样率简介 5. 声道数和...
  • Android音频实时传输与播放---服务端

    千次下载 热门讨论 2012-07-16 22:36:59
    Android音频实时传输与播放 的服务端,接受流与转发流
  • 主要介绍了Android实现音频条形图效果(仿音频动画无监听音频输入)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • Android音频焦点

    千次阅读 2022-01-10 15:11:42
    Android音频焦点 两个或两个以上的 Android 应用可同时向同一输出流播放音频。系统会将所有音频流混合在一起。虽然这是一项出色的技术,但却会给用户带来很大的困扰。为了避免所有音乐应用同时播放,Android 引入了...
  • Android 音频倍速的原理与算法分析

    千次阅读 多人点赞 2021-10-31 00:58:15
    概述 音视频倍速 是内容类APP非常重要的功能,其内部包含了 视频流 和 音频流 的倍速,其中视频倍速原理相对...对于 Android 平台的应用而言,音频倍速通常有3种实现方式: 实现方案 应用 简介 Android Audi

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,039
精华内容 36,015
关键字:

android音频

友情链接: ledrun.rar