知乎专栏 |
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();