Android高性能音频开发介绍

Android面试技术要点汇总
2021-05-17 14:29 · 阅读时长4分钟
小课

性能对于音频开发来说非常重要,低延迟高质量才能确保音频播放流畅,提供给用户更好的用户体验。在学习相关API之前,先了解一下音频的一些基础概念。

  • PCM(Pulse Code Modulation),也被称为脉码编码调制,是一种模拟信号数字化的方式。PCM格式的音频是未经过压缩的音频流数据。
  • Sampling rate,采样率,单位是Hz,表示每秒从模拟信号中采集样本的数量,比如44100Hz,表示每秒进行44100次采样,常见的采样率有44.1kHz、48kHz,96kHz。
  • Sample size,采样大小,也称采样位深,单位是bit,表示音频中一个信号样本可以分为多少个等级,比如说8bit,说明将音频信号分为28=256个等级,常见的有8bit、16bit。
  • Channel,通道,可以是单通道也可以是多通道。

下面看看Android官方提供的高性能API有哪些以及它们的差别。

一、SoundPool

SoundPool可以用来播放一组声音,这些声音必须是存在与本地,因为在播放之前会需要先调用SoundPool.load()方法将音频加载到内存,由于是预先加载好的,而且也无需在播放时编解码,所以性能是很不错的,另外SoundPool还有以下优点:

  • 可以同时播放多个音频。
  • 可以设置音频的优先级。
  • 支持调节播放速率。
  • 可以方便的设置循环播放,调节左右播放音量,以及暂停和恢复播放。

但是缺点也很明显:

  • 只能播放较短的音频,因为需要一次性加载到内存中。
  • 只能播放本地音频,因为需要预加载。
  • 不支持播放状态回调。

总而言之,SoundPool适合播放本地预先配置的一些简短的提示声音。

二、AudioTrack和AudioRecord

AudioTrackAudioRecord是Android系统中比较底层的音频API,AudioTrack用于音频播放,AudioRecord用于录制音频,它们都只能处理未经压缩的原始音频数据,即PCM格式。

AudioTrack支持两种播放模式

  • MODE_STATIC,需要一次性将音频数据加载,适合播放较短的音频,类似SoundPool,但是比SoundPool更加灵活。
  • MODE_STREAM,支持一边播放一边加载,适合播放较长的音频。
三、OpenSL ES

OpenSL ES 是一个跨平台、针对嵌入式系统优化过的高性能音频库,它有专门为Android系统的实现,包含在Android NDK开发工具中

  • <SLES/OpenSLES.h> 和 <SLES/OpenSLES_Platform.h> 提供音频输入和输出相关API。
  • <SLES/OpenSLES_Android.h> 和 <SLES/OpenSLES_AndroidConfiguration.h> 提供了一些Android专用的功能。

主要注意的是NDK中的OpenSL ES并不包含所有标准OpenSL ES的功能和特性。Open SL ES的优势是效率高,由于是C/C++实现的,除了平台专有的功能,都可以实现跨平台,提高开发效率。

官网指南:OpenSL ES

注释
四、AAudio

AAudio 是在 Android O 版本中引入的全新 Android C API。它是专为需要低延迟的高性能音频应用而设计。开发者可以通过读写AAudio的流来输出音频到设备或从设备中读取音频,AAudio流由以下几项定义:

  • 音频设备,作为流中数据的来源或接收器。
  • 共享模式,用于确定流是否对本来可在多个流之间共享的音频设备进行独占访问。
  • 音频格式,流中音频数据的格式。

AAudio是一个非常不错的音频API,但是由于它是在Android 8.1版本才引入的,所以不能兼容很多低版本的设备。

五、Oboe

Oboe 是Google开发的一个用于构建高性能音频应用的C++库,它支持Android 4.1及以上的版本,几乎可以兼容市面上99%的设备。如果运行设备是Android 8.1及以上版本,它会使用AAudio来实现,如果低于Android 8.1则会使用OpenSL ES来实现,而且Oboe设计使用了类似AAudio的API,未来如果要切换到AAudio也是十分方便。

音视频SoundPoolAudioTrackAudioRecordOpenSL ESAAudioOboe