关于使用AudioTrack播放音频PCM数据
AudioTrack的用法:
1.创建AudioTrack的对象。
参数一 streamType 表示使用哪种音频管理策略
STREAM_VOCIE_CALL 电话声音
STREAM_SYSTEM 系统声音
STREAM_RING 铃声
STREAM_MUSCI 音乐声
STREAM_ALARM 警告声
STREAM_NOTIFICATION 通知声
参数二 sampleRateInHz 采样率 前文提过
参数三 channelConfig
常用的有单声道和双声道。注意区分是录制还是播放。
参数四 audioFormat 位宽 前文提过
参数五 bufferSizeInBytes 缓存大小 前文提过
参数六 mode 播放方式
方式一 static方式
需要一次性将所有的数据都写入播放缓冲区,适合播放铃声,较短的音频片段。
方式二 streaming方式
按照一定的时间间隔不间断的写入音频数据。(常用方式)
//采样率
private int mSampleRate =44100;
//位宽
private int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
private int mMinBufferSize;
private int streamType = AudioManager.STREAM_MUSIC;
private int mode = AudioTrack.MODE_STREAM;
private int mChannelCountOut = AudioFormat.CHANNEL_OUT_MONO;
private AudioTrackaudioTrack;
audioTrack =new AudioTrack(streamType, mSampleRate, mChannelCountOut, mAudioFormat, mMinBufferSize, mode);
2.开启一个子线程写入AudioTrack的缓冲区中
private void play()throws FileNotFoundException {
file =new File(rootFile, "test.pcm");
if (!file.exists()) {
return;
}
audioTrack.play(); //开始
fileInputStream =new FileInputStream(file);
outBys =new byte[mMinBufferSize];
new Thread(new Runnable() {
@Override
public void run() {
int len = -1;
try {
while ((len =fileInputStream.read(outBys)) != -1) {
audioTrack.write(outBys, 0, len);
}
}catch (Exception e) {
}finally {
if (audioTrack !=null) {
audioTrack.stop();
audioTrack.release();
}
}
}
}).start();
}