【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 ;


目录
相关文章
|
4月前
|
Android开发
【Android App】蓝牙的设备配对、音频传输、点对点通信的讲解及实战(附源码和演示 超详细)
【Android App】蓝牙的设备配对、音频传输、点对点通信的讲解及实战(附源码和演示 超详细)
84 0
|
4月前
|
XML 编解码 算法
Android开发音效中录制WAV音频和录制MP3音频的讲解及实战(超详细 附源码)
Android开发音效中录制WAV音频和录制MP3音频的讲解及实战(超详细 附源码)
65 0
|
4月前
|
XML Java Android开发
Android 开发中原始音频的录播和和自定义音频控制条的讲解及实战(超详细 附源码)
Android 开发中原始音频的录播和和自定义音频控制条的讲解及实战(超详细 附源码)
27 0
|
4月前
|
XML 存储 Java
Android 开发音频录播中媒体录制器MediaRecorder和媒体播放器MediaPlayer的讲解及实战(超详细 附源码)
Android 开发音频录播中媒体录制器MediaRecorder和媒体播放器MediaPlayer的讲解及实战(超详细 附源码)
42 0
|
21天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
97 0
|
1月前
|
设计模式 人工智能 开发工具
安卓应用开发:构建未来移动体验
【2月更文挑战第17天】 随着智能手机的普及和移动互联网技术的不断进步,安卓应用开发已成为一个热门领域。本文将深入探讨安卓平台的应用开发流程、关键技术以及未来发展趋势。通过分析安卓系统的架构、开发工具和框架,本文旨在为开发者提供全面的技术指导,帮助他们构建高效、创新的移动应用,以满足不断变化的市场需求。
18 1
|
1月前
|
机器学习/深度学习 调度 Android开发
安卓应用开发:打造高效通知管理系统
【2月更文挑战第14天】 在移动操作系统中,通知管理是影响用户体验的关键因素之一。本文将探讨如何在安卓平台上构建一个高效的通知管理系统,包括服务、频道和通知的优化策略。我们将讨论最新的安卓开发工具和技术,以及如何通过这些工具提高通知的可见性和用户互动性,同时确保不会对用户造成干扰。
33 1
|
12天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。