我想播放短於1秒的生成聲音。但是,AudioTrack
的minBufferSize總是似乎是1秒或更長。在某些設備上,我可以將bufferSize設置爲小於使用AudioTrack.getMinBufferSize
評估的值,但是這不適用於所有設備。我想知道是否有可能爲AudioTrack生成較短的聲音。我目前使用此代碼(它包含了一些平滑,因爲我得到不斷有新的頻率的頻道):播放短暫生成的聲音
int buffSize = AudioTrack.getMinBufferSize(sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, buffSize,
AudioTrack.MODE_STREAM);
short samples[] = new short[buffSize];
int amp = 10000;
double twopi = 8. * Math.atan(1.);
double phase = 0.0;
audioTrack.play();
double currentFrequency = getFrequency();
double smoothing = 300;
double deltaTime = buffSize/500;
while (playing && PreferenceManager.getDefaultSharedPreferences(
MainActivity.this).getBoolean("effect_switch", true))
{
double newFrequency = getFrequency();
for (int i = 0; i < buffSize; i++)
{
currentFrequency += deltaTime * (newFrequency - currentFrequency)/smoothing;
samples[i] = (short) (amp * Math.sin(phase));
phase += twopi * currentFrequency/sampleRate;
}
audioTrack.write(samples, 0, buffSize);
}
audioTrack.stop();
audioTrack.release();
其實,我想要的聲音更頻繁地更新,這是我需要的原因更短的樣本。
而不是集中於更短的聲音剪輯叫,你就不能同時運行多個audiotracks? –
我一直在玩這個,我得到了一個約80ms的minBufferSize(我相信)。對於8kHz採樣(普通電話音頻採樣率)爲1280字節,對於44.1kHz採樣爲7056字節(最大)。我只嘗試過一種設備。你有幾個設備的最低限度嗎?我使用相同的參數來獲得'minBufferSize','CHANNEL_OUT_MONO'和'ENCODING_PCM_16BIT'。 – Gary99
@ Gary99我在兩個設備上測試過它 – MetaColon