android音频架构以及技术选型

这篇具有很好参考价值的文章主要介绍了android音频架构以及技术选型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. android音频架构

Android 系统提供了四个层面的音频 API:

1.Java 层 MediaRecorder&MediaPlayer 系列;
2.Java 层 AudioTrack&AudioRecorder 系列;
3.Jni 层 opensles;
4.JNI 层 AAudio(Android O 引入)

下面先上这张经典的 Android 系统架构图:
android音频框架,android,音视频,架构
从图上看 Andorid 整个系统层面从下到上分以下四层:
1.Linux Kernel
2.硬件适配层
3.Framework 层(可分为 Java 层与 C++层)
4.APP 层
我们上面介绍的四个层面的音频 API 实现均在 Framework 层,其他各层音频相关有哪些功能?当我们调用某一 API 时最终是怎么驱动硬件工作的呢?下面我们先看看系统各层音频相关模块及功能。
android音频框架,android,音视频,架构
1.1 Java 层
Java 层提供了 android.media API 与音频硬件进行交互。在内部,此代码会调用相应的 JNI 类,以访问与音频硬件交互的原生代码。

-源代码目录:frameworks/base/media/java/android/media/

  • AudioManager:音频管理器,包括音量管理、AudioFocus 管理、音频设备管理、模式管理;
  • 录音:AudioRecord、MediaRecorder;
  • 播放:AudioTrack、MedaiPlayer、SoundPool、ToneGenerator;
  • 编解码:MediaCodec,音视频数据 编解码接口。

1.2 JNI 层
与 android.media 关联的 JNI 代码可调用较低级别的原生代码,以访问音频硬件。JNI 位于 frameworks/base/core/jni/ 和 frameworks/base/media/jni 中。
这里调用 AAudio 和 OpenSLES 接口。

1.3 Native framework 原生框架层
不管是 Java 层还是 JNI 层都只是对外提供的接口,真正的实现在原生框架层。原生框架可提供相当于 android.media 软件包的原生软件包,从而调用 Binder IPC 代理以访问媒体服务器的特定于音频的服务。原生框架代码位于 frameworks/av/media/libmedia 或frameworks/av/media/libaudioclient中(不同版本,位置有所改变)。

1.4 Binder IPC
Binder IPC 代理用于促进跨越进程边界的通信。代理位于 frameworks/av/media/libmedia或frameworks/av/media/libaudioclient 中,并以字母“I”开头。

1.5 Audio Server
Audio 系统在 Android 中负责音频方面的数据流传输和控制功能,也负责音频设备的管理。这个部分作为 Android 的 Audio 系统的输入/输出层次,一般负责播放 PCM 声音输出和从外部获取 PCM 声音,以及管理声音设备和设置(注意:解码功能不在这里实现,在 android 系统里音频视频的解码是 opencore 或 stagefright 完成的,在解码之后才调用音频系统的接口,创建音频流并播放)。Audio 服务在 Android N(7.0)之前存在于 mediaserver 中,Android N 开始以 audioserver 形式存在,这些音频服务是与 HAL 实现进行交互的实际代码。媒体服务器位于 frameworks/av/services/audioflinger 和frameworks/av/services/audiopolicy中。

Audio 服务包含 AudioFlinger 和 AudioPolicyService:

  • AudioFlinger:主要负责音频流设备的管理以及音频流数据的处理传输,⾳量计算,重采样、混⾳、⾳效等。
  • AudioPolicyService:主要负责⾳频策略相关,⾳量调节⽣效,设备选择,⾳频通路选择等。

1.6 HAL 层
HAL 定义了由音频服务调用且手机必须实现以确保音频硬件功能正常运行的标准接口。音频 HAL 接口位于 hardware/libhardware/include/hardware 中。详情可参阅 audio.h。

1.7 内核驱动层
音频驱动程序可与硬件和 HAL 实现进行交互。我们可以使用高级 Linux 音频架构 (ALSA)、开放声音系统 (OSS) 或自定义驱动程序(HAL 与驱动程序无关)。

注意:如果使用的是 ALSA,建议将 external/tinyalsa 用于驱动程序的用户部分,因为它具有兼容的许可(标准的用户模式库已获得 GPL 许可)。

二·.技术选型及其优缺点

Android 系统为开发者在 SDK 以及 NDK 层提供了多种音频渲染的方法,每一种渲染方法其实也是为不同的场景而设计的,我们必须要了解每一种方法的最佳实践是什么,这样在开发工作中才能如鱼得水地使用它们。

SDK 层的音频渲染

  • MediaPlayer:适合在后台长时间播放本地音乐文件或者在线的流式媒体文件,相当于是一个端到端的播放器,可以播放音频也可以播放视频,它的封装层次比较高,使用方式也比较简单。
  • SoundPool: 也是一个端到端的音频播放器,优点是:延时较低,比较适合有交互反馈音的场景,适合播放比较短的音频片段,比如游戏声音、按键声、铃声片段等,它可以同时播放多个音频。
  • AudioTrack:是直接面向 PCM 数据的音频渲染 API,所以也是一个更加底层的 API,提供了非常强大的控制能力,适合低延迟的播放、流媒体的音频渲染等场景,由于是直接面向 PCM 的数据进行渲染,所以一般情况下需要结合解码器来使用。

NDK 层的音频渲染
Android 系统在 NDK 层(Native 层提供的 API,即 C 或者 C++ 层可以调用的 API)提供了 2 套常用的音频渲染方法,分别是 OpenSL ES 和 AAudio,它们都是为 Android 的低延时场景(实时耳返、RTC、实时反馈交互)而设计的,下面我们一起来看一下。

  • OpenSL ES:是 Khronos Group 开发的 OpenSL ES API 规范的实现,专用于 Android 低延迟高性能的音频场景,API 接口设计会有一些晦涩、复杂,目前 Google 已经不推荐开发者把 OpenSL ES 用于新应用的开发了。但是在 Android8.0 系统以下以及一些碎片化的 Android 设备上它具有更好的兼容性,所以掌握这种音频渲染方法也是十分重要的。
  • AAudio:专门为低延迟、高性能音频应用而设计的,API 设计精简,是 Google 推荐的新应用构建音频的应用接口。掌握这种音频渲染方法,为现有应用中增加这种音频的渲染能力是十分有益的。但是它仅适合 Android 8.0 及以上版本,并且在一些品牌的特殊 Rom 版本中适配性不是特别好。

以下需要注意的点:文章来源地址https://www.toymoban.com/news/detail-730277.html

  1. NDK 层的这两套音频渲染方法适用于不同的 Android 版本,可以应用在不同的场景中。
  2. 里面最通用的渲染 PCM 的方法就是 AudioTrack。
  3. 由于 AudioTrack 是 Android SDK 层提供的最底层的音频播放 API,因此只允许输入 PCM 裸数据。与 MediaPlayer 相比,对于一个压缩的音频文件(比如 MP3、AAC 等文件),它需要开发者自己来实现解码操作和缓冲区控制。

到了这里,关于android音频架构以及技术选型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生技术】JavaScript在云计算中常用的一些框架,以及它们对应的应用类型和主要用途

    在云计算中,JavaScript语言主要用于前端Web开发和服务器端应用程序开发。以下是JavaScript在云计算中常用的一些框架,以及它们对应的应用类型和主要用途,按照您提供的格式进行详细介绍: 1. 前端框架: 框架: React, Angular, Vue.js 应用类型: 普通应用:前端框架如React、An

    2024年01月21日
    浏览(40)
  • Android Spider Frida-Dexdump 脱壳工具下载使用以及相关技术介绍

    本案例使用的App是:引力播.apk,涉及到查壳、脱壳、反编译; 提示:以下是本篇文章正文内容,下面案例可供参考 ApkScan-PKID 查壳工具下载使用:https://blog.csdn.net/EXIxiaozhou/article/details/127196615 JDAX-GUI 反编译工具下载使用:https://blog.csdn.net/EXIxiaozhou/article/details/127207762 Apk下载地

    2024年02月02日
    浏览(43)
  • Android Spider JDAX-GUI 反编译工具下载使用以及相关技术介绍

    反编译工具有很多种,我推荐JADX,后续有更好的反编译工具我会继续补充 jadx 本身就是一个开源项目,源代码已经在 Github 上开源了 官方地址:https://github.com/skylot/jadx zip下载地址:https://github.com/skylot/jadx/releases/tag/v1.4.4 Windows系统我建议走上方的zip下载链接进行下载 Java 1.8

    2023年04月08日
    浏览(30)
  • Android Spider ApkScan-PKID 查壳工具下载使用以及相关技术介绍

    1、壳的功能:壳最本质的功能就是实现加载器,壳是指在一个程序的外面再包裹上另外一段代码,保护里面的代码不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务,深入点就是在apk外面再套一层壳,在运行的时候这层壳

    2024年01月15日
    浏览(31)
  • 光谱、多光谱技术、高光谱技术以及遥感中的应用

    遥感(Remote Sensing),可以理解为遥远的感知。遥感技术利用搭载在遥感平台上面的传感器对目标地物发射或反射的电磁波信息记录下来而形成遥感影像。 其中 分辨率 作为传感器成像系统对输出影像细节辨别能力的一种度量,是遥感影像应用价值的重要技术指标,而对“影

    2024年02月05日
    浏览(33)
  • IP协议以及相关技术

    大家好,我是练习两年半的Java练习生,今天我们来讲一讲计算机网络中的IP协议,以及我们经常听到的一些名词,像NAT、DHCP等等 IP 在 TCP/IP 参考模型中处于第三层,也就是 网络层 。 网络层的主要作用是: 实现主机与主机之间的通信,也叫点对点(end to end)通信。 IP和MAC两

    2023年04月08日
    浏览(21)
  • Elasticsearch 底层技术原理以及性能优化实践

    Elasticsearch是一个基于Lucene库的开源搜索引擎,支持分布式、多租户和全文搜索功能。它使用了RESTful API接口可以简化对Elasticsearch的集成和扩展。 Elasticsearch广泛应用于全文搜索、日志存储和分析、安全事件检测、业务指标分析等领域。 Elasticsearch是一个分布式系统由多个节点

    2024年02月08日
    浏览(34)
  • 安卓之文本转视频的应用场景以及技术优劣分析

            随着科技的进步,文本与视频这两种信息传递形式之间的界限正在逐渐模糊。特别是在安卓平台上,将文本转换为视频的功能已经成为一种重要的应用场景。本文将深入探讨这一功能的应用场景、涉及的关键技术,以及其优劣分析。 1.1、 内容创作与分享      

    2024年01月22日
    浏览(52)
  • 前端性能优化之数据存取,存储以及缓存技术

    无论是哪种计算机语言,说到底它们都是对数据的存取与处理。若能在处理数据前,更快地读取数据,那么必然会对程序执行性能产生积极的作用。 一般而言,js的数据存取有4种方式。 直接字面量:字面量不存储在特定位置也不需要索引,仅仅代表自身。它们包括布尔值,数

    2024年01月25日
    浏览(33)
  • 11-1 项目技术支持以及售后服务

    一,项目技术支持方案 网络拓扑结构 结构选型 当计算机数量较多的时候或可靠性要求较高时,优先采用星系,树型头拓扑结构,根据项目需求所示, 应采用星型拓扑,且使用双链路传输,以及对各个部门实施逻辑上的局域网隔离,使子公司与总公司能够相互通信 1.1项目网

    2024年01月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包