文章目录

  • I . AAudio 音频流内部缓冲区 与 音频数据读写缓冲区 概念
  • II . AAudio 音频流内部缓冲区 缓冲区帧容量 BufferCapacityInFrames 与 缓冲区帧大小 BufferSizeInFrames 区分
  • III . AAudio 音频流内部缓冲区 缓冲区帧容量 BufferCapacityInFrames
  • IV . AAudio 音频流内部缓冲区 缓冲区帧大小 BufferSizeInFrames
  • V . AAudio 音频流内部缓冲区 脉冲串
  • VI . AAudio 音频流内部缓冲区 工作机制 ( 播放音频 )
  • VII . AAudio 音频流内部缓冲区 优化
  • VIII . 音频数据读写缓冲区

I . AAudio 音频流内部缓冲区 与 音频数据读写缓冲区 概念


1 . AAudio 音频流内部缓冲区本质 : 该缓冲区是在音频设备中进行维护的 , AAudio 音频流会先将数据传入该缓冲区 , 然后才进行播放 ;

2 . 音频数据读写缓冲区 : 是在内存中维护的 , 其本质就是一个 void* 类型的数组 , 其数组字节大小由用户设定 ;

3 . 概念区分 : 注意将 AAudio 音频流内部缓冲区 与 音频数据读写缓冲区 区分清楚 ; 两个是完全不同的概念 ;

II . AAudio 音频流内部缓冲区 缓冲区帧容量 BufferCapacityInFrames 与 缓冲区帧大小 BufferSizeInFrames 区分


下面要区分两个概念 , 一个是缓冲区帧容量 BufferCapacityInFrames , 一个是缓冲区帧大小 BufferSizeInFrames , 这两个开发者都可以设置 ;

  • ① 缓冲区帧容量 BufferCapacityInFrames : 是音频设备的缓冲区最大值 ;
  • ② 缓冲区帧大小 BufferSizeInFrames : 用户实际使用的缓冲区大小 , 小于等于 缓冲区容量 ;

做一个形象的比喻 , 水杯有 2L 的容量 , 最大可以装 2L 水 , 2L 相当于缓冲区帧容量 ; 但是我们在水杯的 1.5L 位置画了一个最高水位线 , 表示盛水时不能高于 1.5L , 这个 1.5L 就是我们使用的实际缓冲区帧大小 ;

每帧的样本数就是通道数 , 单声道每帧 1 个样本 , 立体声 每帧 2 个样本 , 每个样本的大小与样本格式有关 , 16 位样本 每个样本 2 字节 ;

III . AAudio 音频流内部缓冲区 缓冲区帧容量 BufferCapacityInFrames


AAudio 音频流内部 缓冲区帧容量 : 音频设备的缓冲区最大值 ;

  • ① 设置缓冲区最大容量 : 调用 AAudioStreamBuilder_setBufferCapacityInFrames() 方法可以设置音频设备缓冲区最大容量 ;
  • ② 获取缓冲区最大容量 : 调用 AAudioStream_getBufferCapacityInFrames() 方法可以获取当前音频设备缓冲区的最大容量 ;

IV . AAudio 音频流内部缓冲区 缓冲区帧大小 BufferSizeInFrames


AAudio 音频流内部缓冲区帧大小 : 为音频设备设置了缓冲区最大容量 , 但是我们可能用不了这么大缓冲区 , 只使用其中一部分作为缓冲区 ;

  • ① 缓冲区帧大小 限制 : 缓冲区帧大小 BufferSizeInFrames 只能小于等于 缓冲区帧容量 BufferCapacityInFrames ;
  • ② 设置 缓冲区帧大小 作用 : 增加 缓冲区帧大小 BufferSizeInFrames 会增加音频延迟 , 反之会减小延迟 ;
  • ③ 设置缓冲区帧大小 方法 : AAudioStreamBuilder_setBufferSizeInFrames() ;
  • ④ 获取缓冲区帧大小 方法 : AAudioStreamBuilder_getBufferSizeInFrames() ;

V . AAudio 音频流内部缓冲区 脉冲串


1 . 脉冲串概念 : 音频设备读取 音频内部缓冲区数据时 , 会以离散的脉冲串形式从缓冲区中读取音频数据 , 每个脉冲串都包含多个音频帧 ;

2 . 脉冲串设置 : 脉冲串包含的帧个数 , 以及脉冲串的读取速度 , 这两个属性由 Android 系统控制 , 与音频设备的电路相关 ;

3 . 脉冲串属性固定 : 脉冲串的大小 和 速度 是无法修改的 , 可以根据 内部缓冲区 包含的脉冲串数量 设置内部缓冲区大小 ;

4 . 脉冲串 性能相关 设置 : AAudio 音频流的 内部缓冲区帧大小 是 脉冲串大小的整数倍时 , 音频延迟最短 ;

VI . AAudio 音频流内部缓冲区 工作机制 ( 播放音频 )


1 . 写出数据到内部缓冲区 : 使用 AAudio 音频流 播放音频时 , 先将数据写入 AAudio 音频流的内部缓冲区 , 该过程会阻塞线程 , 直到写入完成 ;

该缓冲区为音频设备内部维护的

2 . AAudio 音频流 会以 离散的 脉冲串形式 , 读取内部缓冲区中的音频数据 , 然后播放出来 ;

3 . 图示 : 内部缓冲区工作机制如下图 ;

VII . AAudio 音频流内部缓冲区 优化


1 . AAudio 音频流内部缓冲区优化步骤 : 设置一个合适的 缓冲区帧大小 BufferSizeInFrames , 先设置一个较大的缓冲区 , 逐步减小该缓冲区大小 , 监控 XRun ( 超限 或 欠载 ) 数值 , 当出现了上述情况 , 说明缓冲区减小到极限 , 出现了播放问题 , 此时再稍微将缓冲区调大 , 最终的缓冲区大小刚合适 , 兼顾性能与功能 ;

备选方案 : 先设置肯定出问题一个最小值 , 此时肯定会出现缓冲区不足的情况 , 逐步增加缓冲区大小 , 直到流畅读写为止 ;

2 . 调整时间 : 缓冲区大小调整的过程几乎是一瞬间完成的 , 在开始播放第一帧数据时就已经完成 ;

3 . 静音调整 : 缓冲区调整时 , 可以静音初始化缓冲区大小 , 确保用户听不到电流声 ;

4 . 不断调整 : 在音频播放的过程中 , 系统的性能可能随时改变 , 这个缓冲区的大小也要跟着实时修改 , 一旦监测到了 欠载 UnderRun 或 超限 OverRun 就马上调整缓冲区大小 ;

该过程可以参考上一篇博客 : 【Android 高性能音频】AAudio 缓冲区控制 ( XRun | 欠载 UnderRun | 超限 OverRun | 获取缓冲区大小 | 设置缓冲区大小 )

VIII . 音频数据读写缓冲区


1 . 概念区分 ( AAudio 内部缓冲区 / 音频读写缓冲区 ) : 该缓冲区是由用户自己维护的 , 与 AAudio 音频流缓冲区没有任何关系 , 不要混淆这两个概念 ;

2 . 缓冲区本质 : 音频读写缓冲区是在堆内存中维护的 , 其本质就是一个 void* 类型的数组 , 其数组字节大小由用户设定 ;

3 . 读写缓冲区作用 : 读取音频数据时 , 将音频数据先读取到该缓冲区中 ;

4 . 性能分析 : 该音频数据读写缓冲区 与 采样效率相关 , 采样是需要消耗额外性能的 , 如果该缓冲区很大 , 一次采集很多样本 , 采样的效率会很高 , 但是减少了灵活性 , 如果采样太少 , 就会额外消耗很多性能 ;

【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )相关推荐

  1. 【Android 高性能音频】AAudio 音频流 数据回调细节 ( 数据回调函数优先级 | 数据回调函数 | 采样率 | 采样数 | 缓冲区调整 | 线程不安全 )

    文章目录 I . 数据回调函数优先级 II . 数据回调函数 相关内容 III . 采样率 处理细节 IV . 数据回调函数 每次 采样个数 numFrames V . 数据回调函数 缓冲区 ( AA ...

  2. 【Android 高性能音频】AAudio 音频库 简介 ( AAudio 音频库简介 | 音频流 | 音频设备 | 共享模式 | 数据模式 )

    文章目录 I . AAudio 音频库 简介 II . AAudio 音频流 三要素 ( 设备 | 共享模式 | 数据格式 ) III . AAudio 音频设备 IV . AAudio 音频设备获取 ...

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

    文章目录 I . AAudio 音频流创建流程 II . AAudio 音频流构建器 设置 通道数 AAudioStreamBuilder_setChannelCount III . AAudio 音 ...

  4. 【Android 高性能音频】AAudio 音频流 读写操作 ( 音频流读写数据 | 阻塞时间设定 | 注意事项 | AAudioStream_read | AAudioStream_write )

    文章目录 I . AAudio 音频流 读写操作 简介 II . AAudio 音频流 读写操作 阻塞时间设定 III . AAudio 音频流 读取 固定帧数 操作 注意点 IV . AAudio ...

  5. 【Android 高性能音频】AAudio 音频流 PCM 采样 的 采样 缓冲 播放 的 连续机制 ( 数据回调机制 | 数据回调函数指针 | 实现数据回调函数 | 设置数据回调函数 )

    文章目录 I . AAudio 音频流 采样 缓冲 播放 的连续机制 II . AAudio 音频流 数据回调函数 函数指针类型定义 III . AAudio 音频流 数据回调函数 实现 IV . A ...

  6. 【Android 高性能音频】AAudio 音频流 音频设备 相关配置 ( 音频设备ID | 音频流方向 | 音频设备共享模式 )

    文章目录 I . AAudio 音频流创建流程 II . AAudio 音频流构建器 设置音频设备 ID AAudioStreamBuilder_setDeviceId III . AAudio 音频 ...

  7. 【Android 高性能音频】AAudio 缓冲区控制 ( XRun | 欠载 UnderRun | 超限 OverRun | 获取缓冲区大小 | 设置缓冲区大小 )

    文章目录 I . AAudio 音频流 缓冲区控制 II . AAudio 音频流 XRun ( UnderRun | OverRun ) III . AAudio 音频流 当前每次读写帧数 IV . ...

  8. 【Android 高性能音频】AAudio 音频流 构建器 ( AAudio.h | 流构造器 | 音频设备配置 | 音频采样配置 | 构建器销毁 )

    文章目录 I . AAudio 音频流创建流程 II . AAudio 音频流构建器 III . AAudio 音频流构建器 代码示例 IV . AAudio 音频流构建器创建方法 AAudio_cr ...

  9. 【Android 高性能音频】OboeTest 音频性能测试应用 ( 应用简介 | 测试内容 | 输出测试 | Oboe 缓冲区 与 工作负载修改 | 测试案例 )

    文章目录 一.Oboe 测试应用 二.Oboe 测试内容 三.Oboe 输出测试 四.Oboe 缓冲区 与 工作负载修改 五.Oboe 输出测试 ( Pixel 2 | Android 10 ) 一. ...

最新文章

  1. Sass (Syntactically Awesome StyleSheets)
  2. 那些方式可以合并php数组,合并数组(PHP)
  3. 爱奇艺员工拿到北京户口后辞职,被判赔偿公司十万!
  4. 算法---------搜索旋转排序数组
  5. Java黑皮书课后题第4章:*4.2(几何:最大圆距离)最大圆面积是指球面上两个点间的距离。编写一个程序,提示用户以度为单位输入地球上两个点的经纬度,显示其最大圆距离值
  6. mysql dump hbase_mysqldump导出全数据库
  7. DevIL真是好用得想哭
  8. switch 选择语句
  9. mybatis审查要点
  10. 酱油瓶上有两个字很重要,一直都被忽略了,以后看准再买!
  11. [Java] 蓝桥杯BASIC-21 基础练习 Sine之舞
  12. Shell命令-线上查询及帮助之man、help
  13. set nocount on的疑问 set nocount on作用 set nocount on什么意思
  14. 新浪微博api的使用
  15. 计算机专业英语课程内容,《计算机专业英语》课程教学大纲
  16. job title 总汇
  17. 用stream流将list集合根据某个字段分组成Map<String,List<T>>类型的集合
  18. 腾讯产品/策划笔试面试经验
  19. CSS基础班笔记(二)
  20. 【实验】编译原理——编译器认知实验

热门文章

  1. JavaScript多浏览器兼容问题
  2. 【知识碎片】Asp.Net 篇
  3. Linux1:Linux概述
  4. Linux系统CentOS下mysql的安装日志
  5. ubuntu修改环境变量
  6. 【LeetCode】无重复字符的最长子串【滑动窗口法】
  7. JavaScript使用localStorage缓存Js和css文件
  8. manjaro安装teamviewer实现远程连接
  9. stylus-loader (copy)
  10. 《一起》个人进展——Day06