当前位置: 首页 > article >正文

AudioTrack的理解

采样率说的是一秒钟采样多少点
波形频率说的是一个采样周期内有多少个波形
pcm编码说的是 16 还是8 直接决定write的时候使用short还是byte

‌一、初始化配置

  1. ‌参数设定‌
    需定义音频格式、采样率及缓冲区大小,确保符合硬件支持范围
// 音频参数配置
int sampleRate = 44100;          // 标准采样率
int channelConfig = AudioFormat.CHANNEL_OUT_MONO;  // 单声道
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;  // 16位PCM编码
int bufferSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat
);  // 最小缓冲区大小
  1. ‌创建AudioTrack实例‌
    使用流模式(MODE_STREAM)支持实时数据写入
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,    // 音频流类型sampleRate,channelConfig,audioFormat,bufferSize,AudioTrack.MODE_STREAM        // 流式模式
);// 检查初始化状态
if (audioTrack.getState() != AudioTrack.STATE_INITIALIZED) {throw new IllegalStateException("AudioTrack初始化失败");
}

二、音频数据生成与写入‌

  1. ‌生成PCM数据‌
    动态创建指定频率的音频波形(如440Hz正弦波)
short[] generateSineWave(int freq, int durationMs) {int numSamples = durationMs * sampleRate / 1000;short[] buffer = new short[numSamples];double angle = 0;double delta = 2 * Math.PI * freq / sampleRate;for (int i = 0; i < numSamples; i++) {buffer[i] = (short)(Math.sin(angle) * Short.MAX_VALUE);angle += delta;}return buffer;
}
  1. ‌实时数据写入‌
    通过循环写入实现持续播放
short[] audioData = generateSineWave(440, 1000);  // 生成1秒音频
audioTrack.play();  // 启动播放线程// 持续写入数据(示例为简单循环)
while (isPlaying) {int written = audioTrack.write(audioData, 0, audioData.length);if (written != audioData.length) {Log.e("AudioTrack", "数据写入不完整");}
}
http://www.lryc.cn/news/2396698.html

相关文章:

  • HTTP请求与HTTP响应介绍及其字段
  • Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理
  • 中科院报道铁电液晶:从实验室突破到多场景应用展望
  • 智慧政务标准规范介绍:构建高效、协同的政务信息体系
  • 6个月Python学习计划 Day 12 - 字符串处理 文件路径操作
  • CSS篇-3
  • Unity使用Lua框架和C#框架开发游戏的区别
  • Go开发简历优化指南
  • 手机照片太多了存哪里?
  • 【论文笔记】SecAlign: Defending Against Prompt Injection with Preference Optimization
  • IP Search Performance Tests dat/db/xdb/mmdb 结构性能差异对比
  • OpenRouter使用指南
  • Linux 中 m、mm、mmm 函数和 make 的区别
  • 【MAC】YOLOv8/11/12 转换为 CoreML 格式并实现实时目标检测
  • NodeJS全栈WEB3面试题——P7工具链 测试
  • Mybatis框架各配置文件主要内容详解(二)
  • 【优选算法 | 队列 BFS】构建搜索流程的核心思维
  • virtio介绍 (三)--spdk作为virtio后端处理nvme盘io的流程--上
  • 关于BackgroundScheduler的pause
  • 设计模式(行为型)-中介者模式
  • 【Java学习笔记】异常
  • MySQL:视图+用户管理+访问+连接池原理
  • neo4j 5.19.0安装、apoc csv导入导出 及相关问题处理
  • C/C++ OpenCV 矩阵运算
  • 无人机桥梁3D建模的拍摄频率
  • ESP32-idf学习(三)esp32C3连接iot
  • 详解鸿蒙仓颉开发语言中的计时器
  • 【计算机网络】第3章:传输层—拥塞控制原理
  • Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期)
  • 【nssctf第三题】[NSSCTF 2022 Spring Recruit]easy C