Android中的Audio系统框架分析(一)

概述

Audio系统是Android 平台重要的组成部分,我们将从以下几个方面来讲解:
一·Audio基础知识讲解
二、Android系统中Audio框架

Audio基础知识讲解

我们大家知道声音是由物体振动产生的声波。是通过介质(空气或固体、液体)传播并能被人或动物听觉器官所感知的波动现象。最初发出振动(震动)的物体叫声源。声音以波的形式振动(震动)传播。声音有三要素:
1、音量(Volume)
也叫做响度(Loudness),人耳对声音强弱的主观感觉就是响度,响度和声波 振动的幅度有关。

2、音调(Pitch)
人耳对声音高低的感觉称为音调(也叫音频),音调主要与声波的频率有关。声波的频率高,则音调也高。人类能感 知的频率在20 Hz~20000 Hz之间。

3、音色(Quality)
不同的发声体由于其材料、结构不同,则发出声音的音色也不同。

那我们如何将声音录制到手机,并通过手机播放出来呢,这其中涉及到模拟信号和数字信号的转换,如下图所示
信号转换

录制过程:
首先麦克风需要捕获声音信息,初始数据是模拟信号;模拟信号通过模-数转换器(ADC)处理成二进制数据。将上一步得到的数据根据需求进行必要的渲染处理,比如音效调整、过滤等等。接下来就可以存储在设备中了,因为这时后原生数据即PCM数据体积太大,通常会通过压缩编码对其压缩处理,如保存为mp3格式、aac格式等。

播放过程:
从存储设备中读取音频文件,根据录制时编码方式进行对应的解码,解码成原始数据后,音频系统为这一播放实例选定最终匹配的音频回放设备(如耳机、扬声器),之后音频数据信号通过数模转换器(DAC)变换成模拟信号,模拟信号经过回放设备,还原出原始声音。

以上我们所说得模拟信号转换成数字信号,这一过程我们称之为音频采样,采样是把连续的模拟信号转换成离散的数字信号,它涉及到以下几点:
样本(Sample)
这是我们进行采样的初始资料,比如一段连续的声音波形

l 采样器(Sampler)
采样器是将样本转换成终态信号的关键。它可以是一个子系统,也可以指一个操作过程,甚至是一个算法,取决于不同的信号处理场景。理想的采样器要求尽可能不产生信号失真

l 量化(Quantization)
采样后的值还需要通过量化,也就是将连续值近似为某个范围内有限多个离散值的处理过程。因为原始数据是模拟的连续信号,而数字信号则是离散的,它的表达范围是有限的,所以量化是必不可少的一个步骤

l 编码(Coding)
计算机的世界里,所有数值都是用二进制表示的,因而我们还需要把量化值进行二进制编码。这一步通常与量化同时进行。
音频采样

对原始模拟信号进行抽样、量化和编码,我们将得到得PCM音频原始数据,可以通过调整PCM以下几个属性来达到不同的采样需求:
l 采样速率(Sampling Rate)
在将连续信号转化成离散信号时,就涉及到采样周期的选择。如果采样周期太长,虽然文件大小得到控制,但采样后得到的信息很可能无法准确表达原始信息;反之,如果采样的频率过快,则最终产生的数据量会大幅增加,这两种情况都是我们不愿意看到的,因而需要根据实际情况来选择合适的采样速率。由于人耳所能辨识的声音范围是20-20KHZ,所以人们一般都选用44.1KHZ(CD)、48KHZ或者96KHZ来做为采样速率。
l 采样深度(Bit Depth)
我们知道量化(Quantization)是将连续值近似为某个范围内有限多个离散值的处理过程。那么这个范围的宽度以及可用离散值的数量会直接影响到音频采样的准确性。通常有byte、short、float这几种类型。
l 通道数
我们在录制过程中,可以在不同位置放置两套或者多套采集设备,就可以录制两个或者多个通道数据,播放的时候也可以通过不同位置的喇叭、扬声器播放各个通道的声音。通常有单声道、双声道、4.1环绕立体声(5个声道)、7.1环绕立体声(8个声道)。

Android系统中Audio框架

Android系统可以分为应用层、Framework层、系统运行库层、HAL层、Linux内核层,Audio框也是这样,如下图:
Audio框架结构
接下来分别对各个层次进行介绍
1.应用层:
这是整个音频体系的最上层,因而并不是Android系统实现的重点。在这一层可以调用系统接口编写开发一个音乐播放器。

2.Framework层
在这一层,我们经常用到的MediaPlayer、MediaRecorder、进行音频的播放,录制功能,实际上,Android也提供了另两个相似功能的类,即AudioTrack和AudioRecorder。除此以外,Android系统还为我们控制音频系统提供了AudioManager、AudioService及AudioSystem类。

3.系统运行库层
Framework层的实现需要依赖系统系统运行库层。如前面提到到得AudioTrack.java、MediaPlayer.java、都有对应的系统运行库层的AudioTrack.cpp、mediaplayer.cpp类,它们通过JNI进行调用。这一部分代码集中放置在工程的frameworks/av/media/libmedia中,多数是C++语言编写的
除了上面的类库实现外,音频系统还需要一个“核心中控”,或者用Android中通用的实现来讲,需要一个系统服务,这就是AudioFlinger和AudioPolicyService。它们的代码放置在frameworks/av/services/audioflinger和frameworks/av/services/audiopolicy中。我们在整理相关代码的时候可以分为2个线索。
一是以库为线索。比如AudioFlinger都是在libaudioflinger库中,AudioPolicyService在libaudiopolicyservice库中;而AudioTrack、AudioRecorder等一系列实现则在libmedia库中。
其二,以进程为线索。库并不代表一个进程,进程则依赖于库来运行。虽然有的类是在同一个库中实现的,但并不代表它们会在同一个进程中被调用。比如AudioFlinger和AudioPolicyService都驻留于名为audioserver的系统进程中;而AudioTrack/AudioRecorder和MediaPlayer/MediaRecorder一样实际上只是应用进程的一部分,它们通过binder服务来与其它系统进程通信。

4.HAL层
从设计上来看,硬件抽象层是AudioFlinger直接访问的对象。这说明了两个问题,一方面AudioFlinger并不直接调用底层的驱动程序;另一方面,AudioFlinger上层(包括和它同一层的MediaPlayerService)的模块只需要与它进行交互就可以实现音频相关的功能了。因而我们可以认为AudioFlinger是Android音频系统中真正的“隔离板”,无论下面如何变化,上层的实现都可以保持兼容。
音频方面的硬件抽象层主要分为两部分,即AudioFlinger和AudioPolicyService。实际上后者并不是一个真实的设备,只是采用虚拟设备的方式来让厂商可以方便地定制出自己的策略。
抽象层的任务是将AudioFlinger/AudioPolicyService真正地与硬件设备关联起来,但又必须提供灵活的结构来应对变化——特别是对于Android这个更新相当频繁的系统。比如以前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.*为名的各种库中)来填充这些“壳”。根据产品的不同,音频设备存在很大差异,在Android的音频架构中,这些问题都是由HAL层的audio.primary等等库来解决的,而不需要大规模地修改上层实现。换句话说,厂商在定制时的重点就是如何提供这部分库的高效实现了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CrossOver Games For Mac官方下载_2024电脑最新版软件安装包下载

CrossOver Pro For Mac是由codewaver公司开发的类虚拟机软件,目的是使linux和Mac OS X操作系统和window系统兼容。CrossOver Pro For Mac能够直接在Mac上运行Windows软件与游戏,而不需虚拟机,功能是非常强大的,值得大家下载使用。…

Linux系统基本知识----1

1.什么是Linux中的权限,并举例说明。 ****Linux权限是操作系统用来控制特定用户或用户组可以对文件或目录执行的操作的一种机制。例如,chmod 755 filename 命令会设置filename文件的权限,使得拥有者可以读/写/执行,而组用户和其他…

Android Audio实战——声道信息回调(五)

在前面的 AudioTrack 构造中,我们传入了音频的声道信息,这一节我们就来详细介绍一下声道的配置信息。 一、声道介绍 音频中的声道配置从单声道到双声道(立体声)、再到多声道系统(如5.1和7.1),代表了声音录制和回放技术的发展,旨在提供越来越丰富和沉浸式的听觉体验。 …

在Spring Boot中使用Sa-Token实现路径拦截和特定接口放行

在Spring Boot中使用Sa-Token实现路径拦截和特定接口放行 很喜欢的一段话:别想太多,好好生活,也许日子过着过着就会有答案,努力走着走着就会有温柔的着落。 春在路上,花在枝上,所有的美好都在路上&#xff…

【测试专题】系统测试报告(原件Word)

软件测试报告在软件开发过程中起着至关重要的作用,主要有以下几个主要原因: 1、确保软件质量 2、提供决策支持 3、记录测试过程和结果 4、促进沟通和协作 5、符合标准和法规要求 6、改进测试流程和策略 7、降低风险 软件开发全套资料获取进主页或者本文末…

程序猿大战Python——文件操作、异常、模块——os模块

查看目录 目标:了解查看目录的使用。 Python中的os模块包含有操作系统所具备的功能,如查看路径、创建目录、显示文件列表等。 os模块是Python标准库,可直接导入使用: # 导入os模块 import os 在Python中,os模块的常…

全面介绍Linux中的Vim编辑器

一、Vim简介 Vim(Vi IMproved)是从经典的Unix文本编辑器Vi发展而来的一个强大、可扩展的文本编辑器。Vim被设计为高度可配置的,并且具备强大的插件系统,使得它不仅适用于程序员,还适合日常文本编辑。与普通的文本编辑…

H5应用调用企业微信扫一扫API扫码方法

场景:自行开发的企微应用例如扫码入库、二维码资产盘点等等 官网地址:使用说明 - 接口文档 - 企业微信开发者中心 扫一扫接口说明:企业微信扫一扫 - 接口文档 - 企业微信开发者中心 使用Js版本: http://res.wx.qq.com/open/js/jweixin-1.2.0.js 前端JS代码&…

IO流(二)

IO流(二) 目录 IO流 —— 字符流IO流 —— 缓冲流IO流 —— 转换流IO流 —— 打印流IO流 —— 数据流IO流 —— 序列化流 1.IO流 —— 字符流 文件字符输入流 —— 读字符数据进来 字节流:适合复制文件等,不适合读写文本文件字…

nginx rewrite地址重写

目录 常用的nginx正则表达式 location和rewrite的区别 一、location 1.location常用匹配类型 2.location匹配机制 3.实际工作中三大匹配规则 1.网站首页匹配 2.网站静态页面,通过前缀匹配或通用匹配在nginx服务器本地处理 3.网站动态页面,通过匹…

TypeScript语法解析与进阶扩展

TypeScript 1、类型别名2、字符串字面量类型3、元组4、枚举5、类5.1、public private protected5.2、readonly5.3、抽象类5.4、静态成员5.5、类实现接口5.6、接口继承接口5.7、接口继承类 6、泛型6.1、多个类型参数6.2、泛型约束6.3、泛型接口6.4、泛型类6.5、泛型参数的默认类…

Veeam Backup Enterprise Manager身份验证绕过漏洞(CVE-2024-29849)

一、漏洞概述【漏洞通告】 漏洞名称 Veeam Backup Enterprise Manager身份验证绕过漏洞 CVE ID CVE-2024-29849 漏洞类型 身份验证绕过 发现时间 2024-05-22 漏洞评分 9.8 漏洞等级 严重 攻击向量 网络 所需权限 无 利用难度 低 用户交互 无 PoC/EXP 已…

PostgreSQL源码分析——initdb

数据库初始化 在安装完数据库后,需要进行初始化数据库操作,对应PostgreSQL数据库中就是需要进行initdb后,才能对数据库进行启动。initdb的过程,其实就是创建数据库实例的过程,生成模板数据库和相应的目录、文件信息&a…

uniapp小程序限制微信群访问(图文教程)

我有一个微信小程序 “程序员实用资源” 我现在只想让我的微信群可以访问这个小程序的所有功能 所以我必须对我小程序的来源进行限制,让部分功能在正常访问的时候提示没有加群,不可访问,只有从群内点击进入小程序的时候才可以访问这部分功能…

目标检测顶会新成果!20个突破性方法,更高性能,更强理解与分析能力!

【目标检测】在近年来的深度学习领域中备受关注,它通过识别和定位图像中的目标对象,提升了模型在图像理解和分析方面的能力。目标检测技术在自动驾驶、安防监控和医疗影像分析等任务中取得了显著成果。其独特的方法和卓越的表现使其成为研究热点之一。 为…

ESP32蓝牙串口通讯

文章目录 一、前言二、代码三、运行 一、前言 ESP32支持经典蓝牙和低功耗蓝牙(BLE),经典蓝牙可在计算机上模拟出一个串口,使得ESP32可以以串口的方式和计算机通信。 二、代码 #include "BluetoothSerial.h"String device_name …

2025计算机毕业设计选题题目推荐-毕设题目汇总大全

选题在于精,以下是推荐的容易答辩的选题: SpringBoot Vue选题: 基于SpringBoot Vue家政服务系统 基于SpringBoot Vue非物质文化遗产数字化传承 基于SpringBoot Vue兽医站管理系统 基于SpringBoot Vue毕业设计选题管理系统 基于SpringBoot Vue灾害应急救援…

004 AOP使用

文章目录 基于AspectJ的AOP的使用添加依赖编写目标类和目标方法使用XML实现实现步骤切入点表达式通知类型 使用注解实现实现步骤环绕通知注解配置定义通用切入点 纯注解方式 基于AspectJ的AOP的使用 其实就是指的SpringAspectJ整合,不过Spring已经将AspectJ收录到自…

软考中级证在手里,感觉白躺家里了?

软考中级,最适合考的专业是《系统集成项目管理工程师》,特别适合零基础的人! 2022年中级职称的报名条件和要求非常宽松,即使没有学历、零基础和相关工作经验也可以考试!!! 一、职称的含金量 …

docker 中 File Sharing 和Volumes 的区别

在 Docker 中,File Sharing 和 Volumes 都涉及到将文件和目录从主机系统映射到容器中,但它们的用途和实现方式有一些重要的区别: 一、简介 File Sharing 是 Docker Desktop 在 Windows 和 macOS 上的一项功能,允许你将主机文件系…