AudioTrack的理解
采样率说的是一秒钟采样多少点
波形频率说的是一个采样周期内有多少个波形
pcm编码说的是 16 还是8 直接决定write的时候使用short还是byte
一、初始化配置
- 参数设定
需定义音频格式、采样率及缓冲区大小,确保符合硬件支持范围
// 音频参数配置 int sampleRate = 44100; // 标准采样率 int channelConfig = AudioFormat.CHANNEL_OUT_MONO; // 单声道 int audioFormat = AudioFormat.ENCODING_PCM_16BIT; // 16位PCM编码 int bufferSize = AudioTrack.getMinBufferSize( sampleRate, channelConfig, audioFormat ); // 最小缓冲区大小
- 创建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初始化失败"); }
二、音频数据生成与写入
- 生成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
- 实时数据写入
通过循环写入实现持续播放
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", "数据写入不完整"); } }(图片来源网络,侵删)(图片来源网络,侵删)(图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。