• 概述: 基础音频知识

    • 音频的录制、存储和回放
    • 采样定律
    • 音频文件格式
  • Android系统中的音频框架
    • Android音频系统

      • Audio驱动程序
      • 硬件抽象层
      • Audio本地框架层
      • Audio 应用框架层

概述: 基础音频知识

音频的录制、存储和回放

音频采集数据->模拟信号->数模转换器ADC->二进制数据->渲染处理(音效调整/过滤)->音频数据压缩处理 编码

采样定律

奈奎斯特采样理论 中心思想: 当被采样的模拟信号被还原时,其最高频率只有采样频率的一半
人声音范围20—20kHz 选择的采样频率就应该在40kHz左右

音频文件格式

不压缩格式:PCM 数据 wav aiff后缀
无损压缩格式:FLAC m4a APE WV
有损压缩格式:mp3 aac

两种Linux平台下的音频驱动架构
OSS:早期
ALSA:取代OSS,主要文件节点, 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 系统的音频架构主要基于ALSA
现在 TinyALSA 只支持其中两种Interface 像 Raw MIDI Interface Sequencer Interface Timer Interface 则没有涉及

Android系统中的音频框架

Android音频系统

    从上到下依次是app层、java框架层(SoundPool\AudioTrack\AudioManager等)、本地框架层(framework/av)、硬件抽象层、驱动层

Java应用层 :app
Audio的应用框架层:主要是一些java框架类 在framework/base下面
Audio本地框架层:包括AudioRecord.cpp AudioTrack.cpp等libmedia类,向上通过jni(有些称之为jni层)与应用框架层的java类相互调用,向下通过binder机制与audioflinger和audiopolicy等AudioServer进程或者MediaServer进行通信
Audio硬件抽象层:与上层通过AudioFlinger建立连接,向上服务于AudioFlinger,向下与硬件进行交互
Audio驱动程序层:ALSA

Audio驱动程序

驱动程序的框架有ALSA\OSS 等
包含两方面的功能: 控制接口:音量控制、静音、通道控制等
数据接口:需要支持PCM类型的输入输出
在有些系统中,还是和硬件解码结合在一起

硬件抽象层

Audio HAL: 音频的硬件抽象层, 服务的对象是AudioFlinger,是AudioFlinger和Audio硬件之间的层次

Audio HAL 层由主要以下接口组成:

/android_o/hardware/libhardware/include/hardware/audio.h
/android_o/hardware/libhardware/include/hardware/audio_effect.h

需要去实现这些接口

Audio HAL 提供了统一的接口定义它与AudioFlinger/AudioPolicyService之间的通信方式;
这就是 audio_hw_device, audio_stream_in, audio_stream_out等结构体。
由 audio.primary.和audio.a2dp.为名的各种库来填充,产品不同,音频设备存在很大的差异,在Android的音频架构中,这些差异是由HAL层的audio.primary等库解决的

Audio本地框架层

AudioFlinger

    AudioFlinger 把所有的(最多 32 个)AudioTrack 进行混音(Mixer),然后输送 PCM 到 Audiohardware 中进行播放

上层Audio系统的核心由 AudioFlinger AudioPolicyService 和AudioTrack/AudioRecorder 三者构建而成。

其中 AudioFlinger AudioPolicyService 属于System Service,驻留在audioserver进程中,负责不断的处理AudioTrack/AudioRecorder的请求

Audio硬件抽象层以上的部分是Audio的公共部分,一般不会出现问题,更多的是一些客制化的需求;调试Audio的重点在硬件抽象层,在驱动程序有保证的情况下,首先需要调试通过数据流的输入输出逐一调试各种控制类的接口。

新的变化

Android 7.0以后本地框架层有了变化,从原来的MediaServer中分离出几个新的进程,如图所示:

Android O下Google将media部分的代码目录又进行了整理,从下面的目录看
新建了libaudioclient这个目录将AudioTrack、AudioEffect、AudioSystem.cpp、IAudioTrack.cpp、IAudioFlingerClient.cpp、ToneGenerator.cpp等放进去,在结构上与binder的C/S架构显得更加一致;

从Android4.1(jellybean) 开始Google从framework/base下的git库下将media的c/c++部分的多媒体框架单独设立framework/av的目录,给它开辟了一个Git库,到如今进一步的变化可见Google的煞费苦心以及多媒体部分的重要性。

当然多出来的不止libaudioclient,还有libaudiohal、libaaudio等,后续针对性的在研究下libaaudio

Audio 应用框架层

上层接口类型

AudioManager 是一个 java 类,是 android API 中 android.media.*的一部分。提供对音量和 ringer mode(包括铃声和振动)的设置。向下依赖于 AudioService 和 AudioSystem(java)。

AudioService 是一个 java 层系统服务,向底层转发所有用户发起的调用,同时负责监听 audio 动作的消息,如 audio 设备插入拔出,开关屏等。向下依赖于 AudioSystem(java)。

AudioSystem 由两部分组成,分别是 AudioSystem(java)和 AudioSystem(native)。
AudioSystem(java)提供管理 AudioSystem(native)的接口,只由 AudioService 内部调用,不对用 户开放。AudioSystem(native)提供对音频系统的控制,如音量、设备状态、forceUse 等。

AudioTrack 是 android API 中 android.media.*的一部分,提供用户从 java 层直接输出 PCM 数据和部分播放控制接口。AudioTrack 可以直接播放“音源为 PCM” 的音频数据。

AudioRecord:这个主要是用来录音的

AudioService是Android上层音频的核心服务,在SystemServer中启动,为所有音频相关设置提供服务。AudioManager和AudioService是通过Binder机制进行通信。AudioManager拥有AudioService的Bp端,是AudioService在客户端的一个代理。几乎所有的对AudioManager进行的请求,最终都会交给AudioService去处理。而AudioService的实现主要依赖于AudioSystem。AudioSystem是java层到native层的代理。

Android音频系统相关推荐

  1. android音频系统之AudioTrack的使用

    今天,简单讲讲  AudioTrack的使用. 1.Android AudioTrack简介 在android中播放声音可以用MediaPlayer和AudioTrack两种方案的,但是两种方案是 ...

  2. Android 音频系统:从 AudioTrack 到 AudioFlinger(全)

    Android 音频框架概述 Audio 是整个 Android 平台非常重要的一个组成部分,负责音频数据的采集和输出.音频流的控制.音频设备的管理.音量调节等,主要包括如下部分: Audio App ...

  3. android音频系统(4):AudioService之音量管理

    前言:AudioService这个系统服务包含或者使用了几乎所有与音频有关的内容,AudioService是音频系统在java层的大本营: android音频系统,分为两个部分:数据流和策略: 数据流 ...

  4. Android音频系统之四AudioPolicy

    4.1 AudioPolicy的诞生 AudioPolicyService是Android音频系统的两大服务之一,另一个服务是AudioFlinger,这两大服务都在系统启动时有MediaSever加 ...

  5. Android音频系统的改进设想和展望 PulseAudio介绍

    http://www.soomal.com/doc/10100002871.htm 在这里先说明,本人并没有仔细地去看Android和PulseAudio的音频具体源代码和实现,欢迎指正. 从硬件用料 ...

  6. 深度剖析 Android音频系统解析与改进

    导读:Android是用了一个Google自己开发的中间层API来让APP和声音驱动(ALSA或者HAL封闭驱动)通信的.在早期,它是个ALSA的插件:现在则命名为AudioFlinger.但是安卓音 ...

  7. android 4.0 电话录音,ANDROID音频系统散记之四:4.0音频系统HAL初探

    昨天(2011-11-15)发布了Android4.0的源码,今天download下来,开始挺进4.0时代.简单看了一下,发现音频系统方面与2.3的有较多地方不同,下面逐一描述. 一.代码模块位置 1 ...

  8. Android音频系统之AudioPolicyService

    地址:http://blog.csdn.net/edmond999/article/details/18599327 1.1 AudioPolicy Service 在AudioFlinger小节,我 ...

  9. Android音频系统扫盲

    原址 0. 专用术语 1. 物理结构 2. 系统架构 本文基于Freescale IMX平台Codec ALC5625为例. 0. 专用术语 ASLA - Advanced Sound Linux A ...

  10. android音频系统(5):AudioService之音频焦点

    前言:上一节我们分析了AudioService对音量的管理,这一节来看下AudioService对音频焦点的处理,也就是音频系统中的AudioFocus机制,它用来处理多个音频不合理的同时播放的糟糕后 ...

最新文章

  1. 小米AI实验室六篇论文获ICASSP2022收录,多模态语音唤醒挑战赛夺冠
  2. ssm 使用中的一些问题
  3. BeanFactory笔记
  4. python unit test 访问开发代码_python unittest 源码分析
  5. BZOJ 1045 [HAOI2008]糖果传递 ★(环形等分:中位数)
  6. 怎么查看表用了那个序列_3套阴瑜伽序列,让你身心平衡
  7. studying and learning
  8. echarts迁徙图 vue_vue中echarts引入中国地图的案例
  9. GIS案例练习-----------第八天
  10. 基于DSP/FPGA的超高速跳频系统基带设计与实现
  11. BMI体重指数计算器
  12. python判断整数浮点数_Python初识2 整数与浮点数
  13. 征途服务器文件,如何使用云服务器架设征途
  14. Microsoft同步工具SyncToy
  15. SQL工具导出CSV文件中文乱码
  16. java隐藏手机号中间四位和隐藏邮箱
  17. 操作系统知识盘点(四)(内存技术)
  18. QQ邮箱取消免费扩容;苹果搜索引擎“胎死腹中”,核心成员已回归谷歌麾下;Xcode 14导致应用体积大增|极客头条
  19. C# 实现Excel单元格画边框
  20. vue中loading chunk-xxx.css failed和net::ERR_ABORTED 404 解决方法

热门文章

  1. 原生 android 手机,三部具有原生安卓系统的旗舰手机,一部比一部漂亮
  2. 华三服务器升级文档,H3C交换机升级步骤
  3. Axure 基础教程
  4. 电商平台电子面单打印对接
  5. 数据归档方案(带流程图)
  6. Java中的getBytes()方法详解
  7. 硬件只要一块esp8266 nodemcu板+几根杜邦线实现远程PC开机,软件全开源(替代智能开关)
  8. 设定计算机锁定时间,如何设置电脑自动锁屏时间?
  9. 我的世界电脑锁屏.html,怎么设置电脑锁屏
  10. 配置KDiff3作为GIT merge图形化工具