| 知乎专栏 |
int sampleRate = 44100;
int channelConfig = AudioFormat.CHANNEL_OUT_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int buffersize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat);
private final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channelConfig,
audioFormat, buffersize, AudioTrack.MODE_STREAM);
public synchronized void playTrack(byte[] buffer) {
if (audioTrack != null && audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
audioTrack.write(buffer, 0, buffer.length);
}
}
MP3 流
int buffersize = AudioTrack.getMinBufferSize(16000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_MP3);
private final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 16000, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_MP3, buffersize, AudioTrack.MODE_STREAM);
public synchronized void playTrack(byte[] buffer) {
if (audioTrack != null && audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
audioTrack.write(buffer, 0, buffer.length);
}
}
AudioTrack 安卓 14 方案
# 老 Android 系统
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRateInHz, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_MP3, buffersize, AudioTrack.MODE_STREAM);
# 老 Android 系统
audioTrack = new AudioTrack.Builder()
//1、setAudioAttributes:AudioAttributes 实例,不能为空
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)//setUsage 设置 AudioTrack 的使用场景;
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)//setContentType 设置输入的音频文件内容的类型;
.build())
//2、setAudioFormat:AudioFormat是咧 用于描述播放的数据格式,AudioFormat 中包含了编码
//格式,声道和采样率等,不能为空
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)//采样格式
.setSampleRate(16000)//设置采样率
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)//设置声道
.build())
//3、setTransferMode:int模式二选一 MODE_STATIC 与 MODE_STREAM
.setTransferMode(AudioTrack.MODE_STREAM)
//4、setBufferSizeInBytes:int: 用于读取音频数据的内部缓冲区的总大小(以byte为单位)。
//如果 mode 是 MODE_STATIC ,其为音频最大长度;
//如果是 MODE_STREAM ,其值要大于等于接收流的最小缓冲区大小,建议使用 getMinBufferSize(int, int, int) 方法来估算 AudioTrack的实例在流模式下的最小缓冲区大小
.setBufferSizeInBytes(buffersize)
.build();