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

news2024/11/24 20:27:42

概述

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.coloradmin.cn/o/1827912.html

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

相关文章

【JKI SMO】框架讲解(一)

JKI State Machine是一款易于使用且功能强大的状态机模板,可以作为界面或者仪器工作流程的基础框架,但是他不能处理复杂系统的多任务并发机制,因为他是只能处理单个进程。 随之,JKI推出了基于面向对象封装的SMO框架,是…

hugo 博客写作流程 (二)

写作工具 推荐两款软件,本人都使用过: typora和obsidian typora: https://github.com/woniu336/typora-007 新建文章 在博客目录找到shell/quickstart.sh双击打开即可 发布到Github 前提: 魔法上网在Github新建一个仓库 找到shell/quickstart.sh双击打开,选择7.SSH 管理…

Linux系统安装Ruby语言

Ruby是一种面向对象的脚本语言,由日本的计算机科学家松本行弘设计并开发,Ruby的设计哲学强调程序员的幸福感,致力于简化编程的复杂性,并提供一种既强大又易于使用的工具。其语法简洁优雅,易于阅读和书写,使…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 6月16日,星期日

每天一分钟,知晓天下事! 2024年6月16日 星期日 农历五月十一 1、 国家网信办:将涉网络暴力违法情形记入用户信用记录。 2、 卫健委:超三成3岁以下婴幼儿家庭有入托需求,托育服务关注度持续上升。 3、 大陆对台134项关…

单片机与DHT11温湿度检测设计

本次设计是采用STC89C54单片机加上低成本的温湿度模块DHT11构成的温湿度检测系统。设计主要由硬件与软件两部分设计构成。硬件方面包括单片机STC89C54、温湿度模块DHT11、显示模块LCD1602、电池电源、I2C存储器以及控制按键等5个部分。此系统完全基于单片机最小系统并进行一定的…

英伟达与斯坦福携手,打造未来全息XR眼镜:头带时代的终结

在XR(扩展现实)技术的演进过程中,一个显著的挑战在于如何平衡设备的便携性与视觉体验。传统的XR设备由于需要厚重的头带固定光学器件和显示器,不仅增加了体积,还为用户带来了社交上的不便。然而,随着英伟达与斯坦福大学戈登韦茨斯坦教授领导的研究团队的合作,这一难题似…

极致深耕,打造核心竞争壁垒——探寻蓝思科技穿越周期的密码

作者 | 曾响铃 文 | 响铃说 一家企业,如何才能在时代变幻的风云中不计较一时得失,长期稳健发展,穿越周期?本期主题就来探寻一家在湖南的国际化企业的发展密码。 穿越周期的企业,都在坚持一个驱动发展的“原点” 细…

【新课程】PICO VR 交互开发指南

从PICO开始,迈向XR跨平台开发 Unity XR Interaction Toolkit (简称XRI)是一套跨平台的 XR 交互开发工具包,随着版本的更新与完善,逐渐获得了开发者的青睐。各 XR 平台逐步推荐开发者采用 XRI 作为首选的交互开发工具为…

【FreeRTOS】ARM架构汇编实例

目录 ARM架构简明教程1. ARM架构电脑的组成1.2 RISC1.2 提出问题1.3 CPU内部寄存器1.4 汇编指令 2. C函数的反汇编 学习视频 【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】 https://www.…

每日一练——用队列实现栈

225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; Queue.h #pragma once #include<stdlib.h> #include<assert.h> #include<stdbool.h>typedef int QDataType;typedef struct QNode {QDataType data;struct QNode* next; } QNode;typedef struct …

【RabbitMQ】异步消息及Rabbitmq安装

https://blog.csdn.net/weixin_73077810/article/details/133836287 https://www.bilibili.com/video/BV1mN4y1Z7t9/ 同步调用和异步调用 如果我们的业务需要实时得到服务提供方的响应&#xff0c;则应该选择同步通讯&#xff08;同步调用&#xff09;。 如果我们追求更高的效…

【MySQL】在CentOS环境下安装MySQL

目录 一、卸载残留环境 二、获取官方yum源 三、安装yum源 四、安装MySQL 五、启动MySQL 一、卸载残留环境 输入 ps axj | grep mysql 查看是否存在正在运行的MySQL服务 如果有&#xff0c;则先输入 systemctl stop mysqld 来关闭服务 然后输入 rpm -qa | grep mysql 查看…

搭建k8s集群报错unknown command “\u00a0“ for “kubeadm init“

搭建k8s报错unknown command “\u00a0” for “kubeadm init” 网上搜了一下&#xff0c;是因为复制过来的命令前面包含了空格&#xff0c;将复制的命令放到idea可以清楚看到几个命令前面有空格&#xff0c;删除掉就好了&#xff0c;记录一下

达梦基于什么数据库?

达梦数据库&#xff08;DM Database&#xff09;是中国自主研发的高性能关系型数据库管理系统。它并不是基于其他现有的数据库系统&#xff0c;而是完全自主开发的。这种独立开发使其具有很多独特的特点和优势&#xff0c;特别是在安全性、性能优化、适应中国本地化需求等方面。…

【Linux】软硬连接

目录 一.现象 二.硬链接 用处 三.软链接 用处 ​编辑 hello&#xff0c;大家好&#xff0c;今天&#xff0c;我们要学习的内容是软硬链接的。我们将从软连接的作用&#xff0c;硬链接的作用 和软硬链接的区别等方面学习。那我们就开始啦&#xff01; 在看本篇博客之前&a…

leetcode第709题:转换成小写字母

注意字符不仅有26个英文字母&#xff0c;还有特殊字符。特殊字符的话&#xff0c;原样输出。 public class Solution {public char toLowChar(char c){if(c>a&&c<z){return c;}else if(c>A&&c<Z){int n(int)c32;return (char)n;}return c;}publi…

华为机考入门python3--(36)牛客36-字符串加密

分类&#xff1a;字符串 知识点&#xff1a; 判断一个元素是否在集合中 if char not in key_set 计算字母差 index ord(char) - ord(a) 题目来自【牛客】 # 生成加密表 def generate_cipher_table(key):key_set set()cipher_table ""# 去重for char in k…

红队攻防渗透技术实战流程:中间件安全:JettyJenkinsWeblogicWPS

红队攻防渗透实战 1. 中间件安全1.1 中间件-Jetty-CVE&信息泄漏1.2 中间件-Jenkins-CVE&RCE执行1.2.1 cve_2017_1000353 JDK-1.8.0_291 其他版本失效1.2.2 CVE-2018-10008611.2.3 cve_2019_100300 需要用户帐号密码1.3 中间件-Weblogic-CVE&反序列化&RCE1.4 应…

微软正在推动 OpenAI 转变为营利性公司!Sam Altman 或拥有更多股权 股东也“逼宫”保时捷

目前&#xff0c;OpenAI估值为860亿美元&#xff0c;转型为营利性公司或加速OpenAI IPO&#xff0c;微软及其他投资者认为&#xff0c;若 Altman拥有更多股权&#xff0c;可能就不会那么有动力专注于其他项目和投资其他AI公司。 根据The Information最新报道&#xff0c;Sam A…

使用mysqldump导出mysql数据库的数据

使用mysqldump导出mysql数据库的数据 mysqldump是mysql自带的一个工具&#xff0c;路径一般是C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqldump.exe 有点需要导出的数据库&#xff0c;选择导入/导出&#xff0c;选择用mysqldump导出 在使用 IntelliJ IDEA 通过 mysqldum…