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

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

V . AAudio 音频流 设置缓冲区大小 AAudioStream_setBufferSizeInFrames


1. 函数作用 : 在音频流播放时 , 有可能会产生阻塞 , 即 采样播放完毕 , 新采样还没到达 , 该函数可以 通过 改变 缓冲区大小阈值 , 调整 缓冲区的延迟 , 即 如果出现 阻塞 , 可以增大该缓冲区大小 ( 帧数 ) ;


2. 结合 XRun 值使用 : 通过 AAudioStream_getXRunCount() 方法 , 可以获取 欠载 ( UnderRun ) 或 超限 ( OverRun ) 的值 , 根据该 XRun 值进行缓冲区大小的调整 , 达到为每个音频设备设置合适的延迟的目的 ;


3. 可设置的最大值 : 通过 AAudioStream_getBufferCapacityInFrames() 函数可以获取 缓冲区可设置的最大帧数 , 设置帧数时 , 不能超过该数值 ;


4. 查看当前缓冲区大小 : 调用 AAudioStream_getBufferSizeInFrames() 方法 , 可以查看当前的缓冲区帧数 ;


文档中的说法是 : 获取 AAudio 音频流在不阻塞的情况下 , 可以读取 或 写入的最大帧数 , 理解不通 ;


5. AAudioStream_setBufferSizeInFrames 函数简介 :


① 函数原型 : numFrames 是设置的新的缓冲区帧数 , stream 代表 AAudio 音频流指针 ;

AAUDIO_API aaudio_result_t AAudioStream_setBufferSizeInFrames(
  AAudioStream *stream,
  int32_t numFrames


② 代码示例 :

   

//设置当前缓冲区是多少帧
        bufferSize = AAudioStream_setBufferSizeInFrames(stream, bufferSize);



播放器缓冲区 : 这里的帧缓冲区指的是 AAudio 音频流的缓冲区 , 属于播放器 或 音频设备 的固有属性 ;

采样缓冲区 : 注意与采样缓冲区进行区分 , 采样缓冲区指的是 一次性向 AAudio 音频流 读取 或 写入的 字节数 , 注意区分这两个缓冲区 ;

电流产生 : 如果两个缓冲区设置不当 , 会造成音频卡顿 , 电流 , 刺啦 或者 啪啪 的声音 ;

帧大小 : 这里的帧可以理解成一个样本 , 如果是单声道 , 每帧一个样本 , 如果是双声道立体声 , 每帧 2 个样本 ;




VI . AAudio 音频流 采样率设置 AAudioStreamBuilder_setSampleRate


推荐使用默认设置 , 不要调用该方法 设置采样率 , 获取默认的最佳采样率 , 然后根据该采样率进行采样即可 ;


1 . AAudioStreamBuilder_setSampleRate 方法简介 :


① 函数原型 : 设置 AAudio 音频流的采样率 ;

AAUDIO_API void AAudioStreamBuilder_setSampleRate(
  AAudioStreamBuilder *builder,
  int32_t sampleRate
)


② sampleRate 参数 : sampleRate 参数就是采样率 , 其单位 赫兹 ( Hz ) , 一般情况下是 44100 Hz 或 48000 Hz , 代表一秒钟有 44100 或 48000 个采样 ;

2 . 最佳实践 :


① 默认值 : 默认情况下 , 如果不调用该函数设置 AAudio 播放器的采样率 , 其值为 AAUDIO_UNSPECIFIED ;

② 默认行为 : 在默认状态下 , 如果打开 AAudio 音频流 , 系统会自动分配一个最佳值 ;

③ 应用开发推荐 : 打开默认采样率的音频流后 , 调用 AAudioStream_getSampleRate() 可以获取当前 AAudio 音频流的采样率 , 我们可以根据该采样率进行采样 ;

这也是我们推荐的做法 , 直接使用默认值即可 , 如果设置的值不合适 , 会造成 AAudio 音频流打开失败的后果 ;


④ 出错情况 : 如果指定的采样率与音频设备不一致 , 打开音频流会失败 ;



VII . AAudio 音频流 获取当前采样率 AAudioStream_getSampleRate


AAudioStream_getSampleRate 简介 :


① 函数原型 : 该函数用于获取当前 AAudio 音频流 采样率 ;

AAUDIO_API int32_t AAudioStream_getSampleRate(
  AAudioStream *stream
)


② 代码示例 :

       

// 获取音频流采样率
            sampleRate_ = AAudioStream_getSampleRate(playStream_);




VIII . AAudio 音频流 每帧采样数


设置每帧采样数 AAudioStreamBuilder_setSamplesPerFrame() :


① 等同方法 : 该方法 与 AAudioStreamBuilder_setChannelCount() 方法 作用是相同的 ;

② 每帧采样数 : 该值就是通道数 , 如果是单声道 , 每帧只有一个采样 , 如果是 双声道立体声 , 每帧有 2 个采样 ;

③ 函数原型 :

AAUDIO_API void AAudioStreamBuilder_setSamplesPerFrame(
  AAudioStreamBuilder *builder,
  int32_t samplesPerFrame



获取每帧采样数 AAudioStream_getSamplesPerFrame :


① 等同方法 : 该方法 与 AAudioStream_getChannelCount() 方法 作用是相同的 ;

② 每帧采样数 : 该值就是通道数 , 如果是单声道 , 每帧只有一个采样 , 如果是 双声道立体声 , 每帧有 2 个采样 ;

③ 函数原型 :

AAUDIO_API int32_t AAudioStream_getSamplesPerFrame(
  AAudioStream *stream
)


目录
相关文章
|
2月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
2月前
|
Java Android开发 Windows
玩转安卓之配置gradle-8.2.1
为安卓开发配置Gradle 8.2.1,包括下载和解压Gradle、配置环境变量、修改配置文件以增加国内镜像,以及在Android Studio中配置Gradle和JDK的过程。
112 0
玩转安卓之配置gradle-8.2.1
|
4月前
|
Android开发
Android 配置蓝牙遥控器键值
本文详细介绍了Android系统中配置蓝牙遥控器键值的步骤,包括查看设备号、配置键位映射文件(kl文件)、部署kl文件以及调试过程,确保蓝牙遥控器的按键能正确映射到Android系统对应的按键功能。
263 1
|
4月前
|
搜索推荐 Android开发
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
本文分享了不同价位电脑配置对于编译AOSP安卓系统源代码的影响,提供了从6000元到更高价位的电脑配置实例,并比较了它们的编译时间,以供学习AOSP源代码时电脑配置选择的参考。
297 0
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
|
存储 编解码 算法
【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV -> RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )
【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV -> RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )
437 0
|
1月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
20天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
40 19
|
1月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
20天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
45 14
|
23天前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。