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.mfbz.cn/a/459153.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣111---二叉树的最小深度(简单题,Java,递归+非递归)

目录 题目描述: (递归)代码: (非递归、层次遍历)代码: 题目描述: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Panel)

可滑动面板,提供一种轻量的内容展示窗口,方便在不同尺寸中切换。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 说明: 子组件类型&a…

phpcms上传漏洞

原始漏洞 漏洞原理:我们上传一个zip的压缩包,它会解压然后删除其中不是.jpg .gig .png的文件 function check_dir($dir):这是一个PHP函数的定义,它接受一个参数 $dir,代表要检查的目录路径。 $handle opendir($dir)…

抖音电商新店品牌孵化运营打造规划方案

【干货资料持续更新,以防走丢】 抖音电商新店品牌孵化运营打造规划方案 部分资料预览 资料部分是网络整理,仅供学习参考。 PDF共130页(完整资料包含以下内容) 目录 抖音电商运营计划 1. 筹备期 货-人-场匹配 - 确定优质货品…

ANOMALY: meaningless REX prefix used汇总

原因1 未使用指定的python环境 解决方案 使用activate激活指定的python环境 原因2 系统更新然后命令行爆出的错误/电脑中的杀毒软件和系统兼容有问题。 解决方案2 1.将杀毒软件卸载。 2.使用360、电脑管家等对系统进行修复。 原因3 某些软件使用的开源库,比…

苹果Find My App用处多多,产品认准伦茨科技ST17H6x芯片

苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch,如今的Find My已经不单单可以查找苹果的设备,随着第三方设备的加入,将丰富Find My Network的版图。产…

Linux中GPU相关命令

Linux查看显卡信息: lspci | grep -i vga 使用nvidia GPU可以: lspci | grep -i nvidia1 前边的序号 "00:0f.0"是显卡的代号(这里是用的虚拟机); 查看指定显卡的详细信息用以下指令: lspci -v -s 00:0f.01 Linux查看Nvidia显…

电源ATE自动测试系统为您提供一站式自动化测试解决方案

ATECLOUD-POWER电源ATE自动测试系统已为许多客户提供专业的测试解决方案,并且都成功交付。那么电源模块ATE自动测试系统是如何提供测试方案,完成电源测试呢? 在工程师明确用户测试需求、掌握测试方法与步骤之后,从仪器选型到系统开发、再到机…

ACM记忆化DFS与基于优先队列的BFS

基本概念--记忆化DFS 使用数组保存已经算出来的值,在后续的计算中减少大量的重复计算,提高效率。(用于dp不方便,但是搜索方便的情况,可以提升效率。) eg. 记忆化dfs求解斐波那契数列 int dfs(int n) {if…

鱼哥赠书活动第13期:看完这本书教你成为逆向 汇编大佬!!《ARM汇编与逆向工程 蓝狐卷 基础知识》

鱼哥赠书活动第13期:看完这本书教你成为逆向 汇编大佬!! 内容简介:作者简介:译者简介:书本目录:了解更多:赠书抽奖规则:往期赠书福利: 与传统的CISC(Complex …

MWC 2024|「Paraverse平行云」展示空间计算时代沉浸式交互体验

🎉当地时间2月26日,2024年世界移动通信大会(MWC2024)在巴塞罗那拉开帷幕。作为全球移动通信领域最大的技术展会之一,MWC被视为全球通信行业风向标。 🚀随着Vision Pro再次点燃全球空间计算技术热情&#xf…

关于原型的一些总结

猛然发现太久没去复习了,于是复习了一些知识,顺便冒个泡。本次主要总结的知识点关于原型,再文章后半部分有原型相关的题,感兴趣的可直接观看。 一、原型 1.什么是原型 简单理解,原型就是一个对象,通过原…

面试经典150题——随机链表的复制

​前两天断更了两天有点事情🤗 1. 题目描述 2. 题目分析与解析 2.1 思路一 开始还是没什么思路,没思路那就先把题目解决不管方法的好坏。如果不考虑复杂度,该怎么解决? 可以有这样的一种思路: 首先复制链表的所有节…

2024/03/14(网络编程·day2)

一、思维导图 二、TCP通信 //服务器 #include<myhead.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.117.103" //服务器IP int main(int argc, const char *argv[]) {//1、创建一个套接字int sfd -1;sfd socket(AF_INET,SOCK_STREAM,…

Uni-app跟学笔记(五):uni-ui组件库的使用、项目打包(小程序、h5、APP)

文章目录 1&#xff09;uni-ui组件库的使用2&#xff09;项目打包1&#xff1a;微信小程序打包2&#xff1a;h5打包3&#xff1a;安卓打包 本博客为 uni-app 此门课的跟学笔记&#xff0c;目的是便于个人复习和对知识快速索引&#xff0c;源码素材可在均可在视频评论区找到 1&a…

Window部署AgileConfig

AgileConfig&#xff1a;分布式配置中心 github&#xff1a;GitHub - dotnetcore/AgileConfig: 基于.NET Core开发的轻量级分布式配置中心 / .NET Core lightweight configuration server 下载部署包&#xff1a;Releases dotnetcore/AgileConfig GitHub 版本&#xff1a;…

LeetCode刷题记录:(9)从中序与后序遍历序列构造二叉树

leetcode传送通道 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

HTML5:七天学会基础动画网页11

CSS3动画 CSS3过渡的基本用法: CSS3过渡是元素从一种样式逐渐改变为另一种样式的效果。 过渡属性-transition 值与说明 transition-property 必需&#xff0c;指定CSS属性的name&#xff0c;transition效果即哪个属性发生过渡。 transition-duration 必需&#xff0c;t…

基于数据库的全文检索实现

对于内容摘要&#xff0c;信件内容进行全文检索 基于SpringBoot 2.5.6Postgresqljpahibernate实现 依赖 <spring-boot.version>2.5.6</spring-boot.version> <hibernate-types-52.version>2.14.0</hibernate-types-52.version><dependency><…

挂耳式蓝牙耳机哪家的好用?一次搞定的全方位选购攻略

对于那些在锻炼时也不忘享受旋律的朋友们&#xff0c;我要透露挂耳式蓝牙耳机的魔力&#xff01;这种耳机实在是太棒了&#xff0c;我猜很多同好都跟我一样&#xff0c;在做运动时偏爱有音乐相伴&#xff0c;以点燃我们的运动激情。但使用传统入耳式蓝牙耳机跑步时&#xff0c;…
最新文章