我正在使用AudioTrack
类来播放原始声音数据流:
AudioTrack audioTrack;
int sampleRate = 11025;
int channelConfigIn = AudioFormat.CHANNEL_IN_MONO;
int channelConfigOut = AudioFormat.CHANNEL_OUT_STEREO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
.....
int bufferSize = AudioTrack.getMinBufferSize(sampleRate,channelConfigOut,audioFormat);
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,sampleRate,channelConfigOut,audioFormat,bufferSize,AudioTrack.MODE_STREAM);
audioTrack.play();
然后在一个单独的线程上:
while(true)
{
short [] buffer = new short[14500];
//fill buffer with sound data
long time = System.currentTimeMillis();
audioTrack.write(buffer,0,14500);
Log.i("time",(System.currentTimeMillis() - time) + "");
}
我的问题是日志总是显示write
方法阻塞大约0.6秒,这与播放的声音长度(14500个样本)相同,而且手机在播放期间没有响应,主要几乎无法做任何事情都可以帮助......
答案 0 :(得分:0)
您正在使用write()
方法的阻止版本。您可以使用write(float[],int,int,int)代替,将WRITE_NON_BLOCKING作为第4个参数传递,但这样只会写入适合播放缓冲区的数据。我通常更喜欢你已有的方法(专门写一个线程)。你应该期望每个电话都要阻止;毕竟,播放缓冲区只能容纳如此多的数据,并且为了腾出更多空间,必须播放声音(这需要时间)。在您选择的采样率下,14500个样本的声音大约为1.3秒,因此我猜您每次填充buffer
需要大约.7秒。
根据提供的代码,我无法分辨为什么你的UI线程没有响应。