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 < numSamples; i++) {buffer[i] = (short)(Math.sin(angle) * Short.MAX_VALUE);angle += delta;}return buffer;
}
- 实时数据写入
通过循环写入实现持续播放
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", "数据写入不完整");}
}