【Android 高性能音频】AAudio 音频流 样本缓冲 相关配置 ( 通道数 | 样本格式 | 帧缓冲 | 采样率 | 每帧样本数 == 通道数 )(一)

简介: 【Android 高性能音频】AAudio 音频流 样本缓冲 相关配置 ( 通道数 | 样本格式 | 帧缓冲 | 采样率 | 每帧样本数 == 通道数 )(一)

I . AAudio 音频流创建流程


红色标题是本博客讲解的内容 , 黑色是前几篇讲过的内容 ;


使用 AAudio 音频库 , 首先需要导入 AAudio.h 头文件 ;


#include <AAudio.h>


创建 AAudio 音频流 , 需要先创建 AAudio 音频流构建器 , 然后在通过该构建器创建音频流 ;


//创建构建器 , AAudio 音频流通过该构建器创建
    //声明 AAudio 音频流构建器 指针
    AAudioStreamBuilder *builder = nullptr;
    //创建 AAudio 音频流构建器 , 注意传入二维指针
    aaudio_result_t result = AAudio_createStreamBuilder(&builder);


设置音频设备 ID ;


 

// 设置音频流设备 ID
    AAudioStreamBuilder_setDeviceId(builder, playbackDeviceId_);


设音频流方向 ;


 

// 设置音频流方向
    AAudioStreamBuilder_setDirection(builder, AAUDIO_DIRECTION_OUTPUT);


设置音频设备共享模式 ;


   // 设置共享模式 , 独占模式性能更高 , 延迟更低 ; 如果 该音频设备正在被使用 , 设置失败会自动设置成 共享模式

 

AAudioStreamBuilder_setSharingMode(builder, AAUDIO_SHARING_MODE_EXCLUSIVE);


设置性能模式 ;


   // 设置性能模式

 

AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);


设置 AAudio 音频流通道数 :


 

// 设置通道个数
    AAudioStreamBuilder_setChannelCount(builder, sampleChannels_);


设置 AAudio 音频流样本格式 :


 

// 设置音频格式
    AAudioStreamBuilder_setFormat(builder, sampleFormat_);


设置 AAudio 音频流缓冲区大小 : 这里的缓冲区是播放器的缓冲区 , 单位是帧 , 每帧的采样数就是通道数 , 单声道 每帧 1 个采样, 双声道立体声每帧 2 个采样 , 分别对应左右声道的采样 ;


// 设置每帧的缓冲区大小 , 可以通过该设置达到尽可能低的延迟
    AAudioStream_setBufferSizeInFrames(playStream_, framesPerBurst_);


下面会着重对上面的流程细节进行详细解析 ;

每个方法的参数 , 原理 , 返回值 等细节都会讲解到 ;




II . AAudio 音频流构建器 设置 通道数 AAudioStreamBuilder_setChannelCount


1 . AAudio 音频流通道数设置 :


① 函数原型 :

AAUDIO_API void AAudioStreamBuilder_setChannelCount(
  AAudioStreamBuilder *builder,
  int32_t channelCount
)


② 函数作用 : 设置音频流的通道数 , 设置 1 代表 单声道 , 设置 2 代表 立体声 ;

③ 代码示例 :

 

// 设置通道个数
    AAudioStreamBuilder_setChannelCount(builder, sampleChannels_);


2 . 默认处理 :


① 默认值 : 如果没有调用该函数设置通道数 , 默认为 AAUDIO_UNSPECIFIED ;


② 默认情况处理 : 如果通道数未指定 , 打开流时系统自动选择一个最佳通道数 , 不同设备可能有不同的通道数 ;


3. 指定通道值情况处理 : 如果指定了通道数 , 那么打开流时会使用该通道数 ; 如果通道数与设备不匹配 , 那么 AAudio 音频流打开时会报错 ;




III . AAudio 音频流构建器 设置音频格式 AAudioStreamBuilder_setFormat


1 . AAudio 音频流格式设置 :


① 函数原型 :

AAUDIO_API void AAudioStreamBuilder_setFormat(
  AAudioStreamBuilder *builder,
  aaudio_format_t format
)


② 函数作用 : 设置 AAudio 音频流的样本数据格式 ;

③ 参数 AAudioStreamBuilder *builder : AAudio 音频流构建器 ;

④ 参数 aaudio_format_t format : 音频格式 , 一般是 AAUDIO_FORMAT_PCM_FLOAT ( 浮点型采样格式 ) 或 AAUDIO_FORMAT_PCM_I16 ( 每个采样 16 位 ) ;

⑤ 代码示例 :

 

// 设置音频格式
    AAudioStreamBuilder_setFormat(builder, sampleFormat_);


2 . 默认设置 :


① 默认值 : 如果没有设置音频流样本格式 , 那么会默认设置成 AAUDIO_UNSPECIFIED ;


② 默认值打开流 : 默认值 AAUDIO_UNSPECIFIED 状态下 , 如果打开 AAudio 音频流 , 系统会自动选择一个最佳的样本格式 , 这个值可能由 Android 设备决定 , 每个设备的值可能都不一样 ;




IV . AAudio 音频流 样本格式


AAudio 音频流 样本格式 :


① 样本格式定义 : aaudio_format_t 是 int32_t 类型数据 , 该枚举有四种取值 ;

e

num {
    AAUDIO_FORMAT_INVALID = -1,
    AAUDIO_FORMAT_UNSPECIFIED = 0,
    /**
     * This format uses the int16_t data type.
     * The maximum range of the data is -32768 to 32767.
     */
    AAUDIO_FORMAT_PCM_I16,
    /**
     * This format uses the float data type.
     * The nominal range of the data is [-1.0f, 1.0f).
     * Values outside that range may be clipped.
     *
     * See also 'floatData' at
     * https://developer.android.com/reference/android/media/AudioTrack#write(float[],%20int,%20int,%20int)
     */
    AAUDIO_FORMAT_PCM_FLOAT
};
typedef int32_t aaudio_format_t


② AAUDIO_FORMAT_UNSPECIFIED 格式 : 未定义格式 , 默认的格式 , 如果音频流打开系统跟自动选择合适的采样格式 ;

③ AAUDIO_FORMAT_PCM_I16 格式 : 每个样本是 16 位 , 其取值范围是 -32768 ~ 32767 ;

④ AAUDIO_FORMAT_PCM_FLOAT 格式 : 样本由浮点型表示 , 取值范围 -1.0 ~ +1.0 ;


目录
相关文章
|
7月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
7月前
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
5月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
118 1
|
7月前
|
开发工具 Android开发 开发者
Android `.9.png` 图像是用于UI的可拉伸格式,保持元素清晰度和比例
【6月更文挑战第26天】Android `.9.png` 图像是用于UI的可拉伸格式,保持元素清晰度和比例。通过边上的黑线定义拉伸区域,右下角黑点标识内容区域,适应文本或组件大小变化。常用于按钮、背景等,确保跨屏幕尺寸显示质量。Android SDK 提供`draw9patch.bat`工具来创建和编辑。**
263 6
|
7月前
|
Android开发 Kotlin
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【本地】音频,播放完随机播放下一首,遇到播放错误,也自动播放下一首
使用Kotlin和Jetpack Compose开发的安卓应用中,实现了两个EvoPlayer同时播放res/raw目录下的音频。一个音轨播放人声(顺序播放),另一个播放背景音乐(随机播放)。每个音轨都有独立的播放和停止控制,且在播放结束或遇到错误时会自动切换到下一首。MediaPlayer置于ViewModel中,UI界面包含播放和停止按钮,控制两个音轨。每次切换音频前,还会随机调整播放速度在0.9到1.2之间。代码示例展示了如何创建ViewModel和UI以实现这一功能。
|
安全 API Android开发
【Android 高性能音频】AAudio 音频流 数据回调细节 ( 数据回调函数优先级 | 数据回调函数 | 采样率 | 采样数 | 缓冲区调整 | 线程不安全 )
【Android 高性能音频】AAudio 音频流 数据回调细节 ( 数据回调函数优先级 | 数据回调函数 | 采样率 | 采样数 | 缓冲区调整 | 线程不安全 )
508 0
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
28天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
53 19
|
2月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
28天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
56 14