Android 音频系统

导入

早期Linux版本采用的是OSS框架,它也是Unix及类Unix系统中广泛使用的一种音频体系。

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

从Linux 2.6 开始,ALSA成了Linux系统默认的音频框架。

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

Element

Description

alsa-driver

内核驱动包

alsa-lib

用户空间的函数库

alsa-utils

包含了很多实用的小程序,比如

alsactl:用于保存设备设置

amixer:是一个命令行程序,用于声量和其它声音控制

alsamixer:amixer的ncurses版

acconnect和aseqview:制作MIDI连接,以及检查已连接的端口列表

aplay和arecord:两个命令行程序,分别用于播放和录制多种格式的音频

alsa-tools

包含一系列工具程序

alsa-firmware

音频固件支持包

alsa-plugins

插件包,比如jack,pulse,maemo

alsa-oss

用于兼容OSS的模拟包

pyalsa

用于编译python版本的alsa lib

在Android中精简了ALSA库中不需要的代码,并将库的名称改为libtinyalsa.so,目前libtinyalsa.so中只提供两种基本API:pcm和mixer

Android 系统中音频框架

在 Android 系统中,音频通路由应用程序、系统组件和设备驱动程序等多个层次构成:

应用程序 应用程序是最接近用户的层次,通过该层次可以实现不同的音频功能,例如录制声音、播放音乐、电话通话等。应用程序通过调用 Android 框架提供的相应 API 来控制音频数据的采集、传输和输出,并将信号传递给下一层别系统。
|
音频处理模块 Android 中提供了不少音频处理模块,如 OpenSL ES、AudioTrackAudioRecord、MediaRecorder等,这些模块可完成音频编解码、降噪、混响、均衡器等处理操作。在 Android 中,音频处理模块都基于 Java 和 C++ 实现,在处理音频数据时需要调用底层的音频驱动程序和 HAL 进行数据交换等。
|
音频抽象层 (HAL) 音频抽象层 (HAL) 位于音频处理模块和音频硬件驱动之间,其作用是对 Android 音频框架进行抽象,将上层的请求转发到底层的音频驱动程序中实现。不同的音频 HAL 对应不同的音频处理器,需要根据具体情况进行开发和配置。
|
音频设备驱动程序 音频设备驱动程序位于 HAL 和底层音频硬件之间,其作用是实现 Android 音频框架和硬件之间的数据通信和控制。每个音频设备有一个特定的硬件驱动程序,并包含输入通路 (IN) 和输出通路 (OUT) 两个方面。
|
底层硬件 底层硬件是实现音频通路的最终载体,包括声卡、编解码器、扬声器、麦克风等多种类型的物理硬件组件。在 Android 设备中,这些硬件会接入到不同的总线中,如 PCM/I2S,AC97 等,并由相应的音频驱动程序进行控制和管理。

AudioRecord 是如何从音频抽象层获取数据的

调用 Java API 应用程序通过 Java API 创建并初始化 AudioRecord 对象,指定了音频源,采样率、通道数等参数。
|
JNI接口调用 Java 层面通过 JNI 接口调用 C++ 层面的 AudioRecord JNI 方法,JNI 方法会根据 Java 提供的参数来构造打开音频设备,并启动数据传输。
|
引擎回调方式 AudioRecord 采用了引擎回调方式,即向 AudioRecord 注册一个回调函数 onRecordFrameAvailable()。当有可用的音频数据时,底层音频驱动就会调用该回调函数,将数据传递回 Java 层面。
|
音频采集和缓冲 在音频采集过程中,音频硬件驱动程序会将原始模拟信号转化为数字信号,并存储在音频输入缓冲区或 FIFO 中等待处理。AudioRecord 将预先分配的缓冲区与输入写入的音频数据进行交替处理,以确保连续不断地读取音频数据
|
数据处理和返回 上述步骤完成后,数据经过采样、量化等处理后被转换成 PCM 码流,并存储在 AudioRecord 的缓冲区中。当缓冲区满或数据达到阈值时,数据回溯至JNI层面,在此处再被转化为 Java NIO 中的 ByteBuffer 类型,并通过 JniEnv 调用Java函数汇报读取完毕。

由于 Android 平台支持多种音频硬件驱动和 HAL 层,因此 AudioRecord 获取数据的具体实现可能与不同硬件平台、音频架构和应用程序的编写有关,例如底层 DMA 机制和 ADC/DAC 设计

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

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

相关文章

代码随想录day20(2)二叉树:完全二叉树节点个数(leetcode222)

题目要求:求一个完全二叉树的节点个数 思路:首先完全二叉树可以用普通二叉树的方法来求,但是需要遍历所有的节点。 但是对于完全二叉树来说,只有最底层右侧的节点可能没满,其余每层节点都达到了最大值。所以我们可以…

智慧城管:街面秩序沿街商铺视频可视化AI智能监管方案

一、背景分析 随着城市化的加速和商业活动的日益繁荣,沿街商铺的管理面临着越来越多的挑战。沿街商户的乱堆乱放、占道经营、违章停车等违法行为,一直以来都是城市管理中的难题。这不仅存在交通安全隐患,也造成了市容秩序混乱,严…

MFMailComposeViewController 发送邮件

通过 MFMailComposeViewController 发送邮件,需预先登录邮箱账号的情况下; 具体实现与配置参数请参考如下: 首先,引入 MFMailComposeViewController 库 #import <MessageUI/MessageUI.h> 其次,实现相关 api 方法 if ([MFMailComposeViewController canSendMail]) {MFM…

整型变量的原子操作

什么是原子操作 原子操作&#xff08;Atomic Operation&#xff09;是指不可中断的操作&#xff0c;即在多线程环境下&#xff0c;当一个线程在执行原子操作时&#xff0c;不会被其他线程的调度和中断所影响。这种操作在多线程编程中尤为重要&#xff0c;因为它能保证操作的原…

从零开始搭建医保购药APP:技术选择与开发流程

医保购药APP作为一种创新的医疗服务工具&#xff0c;为用户提供了便捷的医保购药流程&#xff0c;同时也为医疗机构提供了更高效的管理和服务方式。今天小编将为大家讲解如何从零开始搭建一款医保购药APP&#xff0c;包括技术选择和开发流程。 一、技术选择 在搭建医保购药APP…

openssl3.2 - note - Decoders and Encoders with OpenSSL

文章目录 openssl3.2 - note - Decoders and Encoders with OpenSSL概述笔记编码器/解码器的调用链OSSL_STORE 编码器/解码器的名称和属性OSSL_FUNC_decoder_freectx_fnOSSL_FUNC_encoder_encode_fn官方文档END openssl3.2 - note - Decoders and Encoders with OpenSSL 概述 …

js-循环返回多条数据,每条数据文本超过三行进行展开与收起的实现

1.基本需求 返回多条数据&#xff0c;每条数据在一定宽度的盒子内&#xff0c;文本超过三行进行文本的展开与收起 2.实现逻辑 对于返回的每条数据添加属性expend&#xff1a;false来在循环中进行对于展开收起的判断。 动态计算盒子宽度随着分辨率的变化而变化的值boxWidth。获…

基于单片机的智能环境监测系统

摘 要 本设计主要由温湿度检测、烟雾检测电路、报警电路、显示电路和人体检测等模块组成。温湿度检测部分使用的是DHT11这种型号的温湿度传感器。DHT11是一种单总线型数字式温湿度传感器&#xff0c;它具有误差小、分辨率高、抗干扰能力强等特点。在烟雾检测电路模块当中&…

Nginx 隐藏版本号

只是隐藏 Nginx 版本号&#xff0c;只需在 Nginx 配置文件全局段添加 server_tokens off 然后重启 Nginx 服务 默认安装好了的 Nginx 服务 查看版本 现在修改配置 重启 Nginx 版本信息看不到了 我们下期见&#xff0c;拜拜&#xff01;

Win11安装Plsql140报错2503

一、安装异常 二、解决办法 出现上述问题&#xff0c;主要是因为msi包安装的权限问题&#xff0c;使用管理员权限安装即解决 。cmd控制台以管理员身份打开WINR&#xff09;->(SHIFTCTRLRNTER)&#xff0c;进入到msi安装包目录下&#xff0c;以管理员身份安装即可&#xff1…

mysql数据库:使用 bash脚本 + 定时任务 自动备份数据

mysql数据库&#xff1a;使用 bash脚本 定时任务 自动备份数据 1、前言2、为什么需要自动化备份&#xff1f;3、编写备份脚本4、备份脚本授权5、添加定时任务6、重启 crond / 检查 crond 服务状态7、备份文件检查 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏…

LeetCode28.找出字符串中第一个匹配项

28.找出字符串中第一个匹配项 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入…

“优化消费环境 维护消费者权”荥阳市城关乡社工站开展3·15宣传志愿活动

又是一年“315”&#xff0c;为提高辖区群众消费维权意识&#xff0c;让他们可以学会运用政策法律知识维护自身合法权益&#xff0c;同时也为营造出辖区良好营商环境。2024年3月15日&#xff0c;在荥阳市民政局、荥阳市市场监督管理局、城关乡人民政府的支持下&#xff0c;城关…

“值此春意,共享蓝天”—携手植新绿·静待成荫时

种竹交加翠&#xff0c;栽桃烂漫红。——唐杜甫《春日江村》 春风十里&#xff0c;万物生长。春风吹拂绿色现&#xff0c;树吐嫩芽花鲜艳。植树正是好季节&#xff0c;男女老少齐挥铲。种下棵棵小树苗&#xff0c;辛勤培育勤浇灌。来年长成苍天木&#xff0c;绿树成荫美景见。 …

基于ElasticSearch存储海量AIS数据:时空立方体索引篇

文章目录 引言I 时间维切分II 空间范围切分引言 索引结构制约着查询请求的类型和处理方式,索引整体架构制约着查询请求的处理效率。随着时间推移,AIS数据在空间分布上具备局部聚集性,如 果简单地将所有AIS数据插入一个索引结构,随着数据量增长,索引的更新效率、查询效率及…

RabbitMQ 模拟实现【六】:程序模拟实现

文章目录 模拟实现模拟消费者模拟生产者效果展示 启动结果如下&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/71841546ad8043f1bd51e4408df791de.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f6e3e72ff9a4483c978ec48e24f075c2.p…

OceanBase原理之内存管理

第1章 前言 1.1 多租户管理简介 OceanBase数据库中&#xff0c;应用了单集群多租户的设计&#xff0c;使得一个集群内能够创建多个彼此独立的租户。在OceanBase数据库&#xff0c;租户成为了资源分配的单位&#xff0c;同时还是数据库对象管理和资源管理的基础。 在某种程度…

桌面备忘录,电脑桌面备忘录怎么设置

在当今快节奏的生活中&#xff0c;备忘录成为了人们工作和生活中不可或缺的工具。然而&#xff0c;随着科技的发展&#xff0c;纸质备忘录逐渐被电子桌面备忘录所取代。在电脑桌面设置备忘录&#xff0c;可以更加高效地管理任务和提醒事项。 电脑桌面是我们日常工作和娱乐的主…

2024年语言艺术、人文发展与教育国际会议(ICLAHDE2024)

2024年文学、历史与艺术设计国际会议(ICLHAD2024) 一、【会议简介】 2024年国际语言艺术、人文发展与教育会议&#xff08;ICLAHDE2024&#xff09;将在中国昆明举行&#xff0c;主题为“语言、人文与艺术”。ICLAHDE汇集了来自世界各地语言艺术、人类发展和教育领域的学者、工…

UE5C++学习(二)--- 角色简单连击

本文记录一下一个简单的角色基础连招。 它的做法就是&#xff1a;我们鼠标左键连续按下&#xff0c;会有一个动画蒙太奇索引去计数&#xff0c;获取到对应的蒙太奇动画数组中指定下标的攻击蒙太奇动画&#xff0c;然后进行播放&#xff1b;在播放的过程中用StartAttack()骨骼通…