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

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.xdnf.cn/news/9554.html

相关文章:

  • Mini-F5265-OB开发板——UART不定长接收
  • 内联盒模型基本概念?——前端面试中的隐形考点剖析
  • 前端EXCEL插件智表ZCELL数据源功能详解
  • LabVIEW 中内存释放相关问题
  • 2025年渗透测试面试题总结-匿名[校招]安全工程师(甲方)(题目+回答)
  • 第2讲、从启动到表单加载:Odoo 18 的完整执行流程详解
  • [科研实践] VS Code (Copilot) + Overleaf (使用 Overleaf Workshop 插件)
  • RabbitMQ仲裁队列高可用架构解析
  • Mac 版不能连接华为 GaussDB 吗?我看 Windows 版可以连接?
  • delphi12 sqlserver 客户-服务简单连接设置
  • GitLab CI流水线权限隔离
  • 数据结构-代码总结
  • Spring AI系列之使用 Mistral AI API 实现函数调用
  • MySQL 默认的隔离级别解析
  • AWS WebRTC:获取ICE服务地址(part 1)
  • Flask集成Selenium实现网页截图
  • SpringBoot+tabula+pdfbox解析pdf中的段落和表格数据
  • docker学习基本使用教程
  • Cursor:开启智能编程新视界
  • :inline=“true“会发生什么
  • 音视频解码基础知识
  • 从C++编程入手设计模式1——单例模式
  • Canvas实例篇:黑客帝国-3D字幕雨
  • 力扣面试150题--二叉树的最近公共祖先
  • 【Java工程师面试全攻略】Day3:Java并发编程面试精要
  • Linux系统中使用find命令自动清理过期备份文件的完整指南
  • 【Python】 -- 趣味代码 - 佩奇
  • 【数据结构初阶】顺序表的应用
  • 【 java 基础问题 第二篇 】
  • Bitset